Функция acos работает в интервале -1 <= x <= 1. </p>
Иногда, из-за округления, я получаю 1.00001, чтобы вычислить акос, тогда в следующем предложении where дается ошибка с плавающей точкой:
where
(6371 * acos(cos(radians(@ga_where)) * cos(radians(thing_geolocation.ga_thing)) * cos(radians(thing_geolocation.go_thing) - radians(@go_where)) + sin(radians(@ga_where)) * sin(radians(thing_geolocation.ga_thing)))) < 1.5
Итак, мне придется изменить этот пункт where на что-то вроде этого:
where
(
6371 *
acos
(
case
when cos(radians(@latitude)) * cos(radians(thing_geolocation.ga_thing)) * cos(radians(thing_geolocation.go_thing) - radians(@longitude)) + sin(radians(@latitude)) * sin(radians(thing_geolocation.ga_thing)) > 1 then 1
when cos(radians(@latitude)) * cos(radians(thing_geolocation.ga_thing)) * cos(radians(thing_geolocation.go_thing) - radians(@longitude)) + sin(radians(@latitude)) * sin(radians(thing_geolocation.ga_thing)) < -1 then -1
else cos(radians(@latitude)) * cos(radians(thing_geolocation.ga_thing)) * cos(radians(thing_geolocation.go_thing) - radians(@longitude)) + sin(radians(@latitude)) * sin(radians(thing_geolocation.ga_thing))
end
)
) < 1.5
Но разве это не звучит хорошо (это приведет к вычислению расстояния 3х, верно?).
У меня есть другие идеи, например, подзапрос или исходное приложение, но поскольку начальный запрос очень сложен и те же поля используются для других целей, я пытаюсь решить его без изменения всего запроса.
ps: я пытался использовать функцию point.distance, но она не работает с нулевыми значениями, поэтому я выбрал keep this.
Есть идеи?