Произошла недопустимая операция с плавающей запятой.SQL Server 2008 - PullRequest
9 голосов
/ 12 января 2012

У меня странная проблема с этим кодом: если я запускаю его, как показано ниже, я получаю ошибку:

Произошла недопустимая операция с плавающей запятой.

Но если я изменю параметр @Longitude на -98.508730 ( обратите внимание, только последняя измененная цифра ) код работает просто отлично.

Код должен перечислять свойства в @MilesRadius вокруг некоторой точки LatLng.
Параметры @Latitude и @Longitude того же типа, что и поля долготы и широты в таблице Address.

Что я могу сделать здесь? Благодаря.

DECLARE @Latitude decimal (10,6);
DECLARE @Longitude decimal (10,6);
DECLARE @MilesRadius int;
SET @Latitude = 29.607654
SET @Longitude = -98.508731
SET @MilesRadius  = 5

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           ((3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))))) as distance
FROM       Shared.Address ADR
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           (3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude)))) < @MilesRadius                       
ORDER BY distance

1 Ответ

11 голосов
/ 12 января 2012

Единственная используемая вами функция, которая возвращает ошибку домена, это ACOS, и она возникает, когда вход не находится в диапазоне -1 to +1, поэтому вы можете просто изменить этот случайпромежуточное выражение что-то вроде 1.000000000001 из-за ошибок округления)

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           distance
FROM       Shared.Address ADR
CROSS APPLY (SELECT cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))) T(ACosInput)
CROSS APPLY (SELECT ((3959 * acos(CASE WHEN ABS(ACosInput) > 1 THEN SIGN(ACosInput)*1 ELSE ACosInput END)))) T2(distance)
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           distance < @MilesRadius                       
ORDER BY distance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...