2016-01-06 2 views
0
DECLARE @Lat1 AS DECIMAL(9,5) 
DECLARE @Lon1 AS DECIMAL(9,5) 
DECLARE @Radius AS DECIMAL(9,5) 

SET @Lat1 = '32.74' 
SET @Lon1 = '-117.20' 
SET @Radius = 3960 

declare @CC decimal(9,5),@CS decimal(9,5),@rlat decimal(9,5),@slat decimal(9,5) 

Select 
    @CC = cos(RADIANS(@Lat1))*cos(RADIANS(@Lon1)) 
    , @CS = cos(RADIANS(@Lat1))*sin(RADIANS(@Lon1)) 
    , @slat = Sin(radians(@lat1)) 

SELECT 
    call_id, dtservertime, sdisconnectreason, 
    icompleted, Geolat, Geolong, sZipCode 
FROM 
    (SELECT 
     call_id, dtServerTime, sDisconnectReason, 
     iCompleted, Geolat, Geolong, sZipCode 
     ,convert(decimal(9,5),radians(geoLat)) as Rlat 
     ,convert(decimal(9,5),radians(geoLong)) as Rlong 
    FROM 
     dbo.vMarketing) as x 
WHERE 
    x.dtservertime >= '1/1/2016' and 
    (acos(
     @cc*(cos(rlat)*cos(RLONG)) 
    + @cs*(cos(RLAT)*sin(RLONG)) 
    + @SLat*sin(RLAT) 
) * @Radius 
) < 8 

Я продолжаю получать ошибку по этому запросу, указав, что произошла недопустимая операция с плавающей запятой.SQL Haversine Formula

Что не так ???

+0

Значение передается в 'acos' функция вне диапазона, как объяснено в ответе, который вызывает эта ошибка с плавающей запятой. – Sunil

+0

Реальный вопрос: зачем внедрять формулу Хаверсина в T-SQL вообще? Начиная с SQL 2008, у нас был тип данных географии, который позволит вам вычислить расстояние между двумя точками. –

ответ

1

Вам необходимо передать действительное значение функции acos, то есть пройденное значение должно быть между -1 и +1. Таким образом, следующие запросы вызовут floating point error в SQL Server.

запросов, которые вызывают

select acos(-1.1); 
select acos(2.5); 

Запросы ошибку с плавающей точкой, которая не будет вызывать ошибку с плавающей точкой

select acos(-1.0); 
select acos(0.7); 

Из Math мы знаем, что косинус угла всегда будет лежать между -1 и +1.

В вашей ситуации следующее выражение, которое вы передаете в acos, выполняет функцию вне диапазона от -1 до +1.

@cc * (COS(rlat) * COS(RLONG)) + @cs * (COS(RLAT) * SIN(RLONG)) + @SLat * SIN(RLAT) 

На приведенном ниже рисунке показано, как ведет себя этот недопустимый вызов функции в SQL Server Management Studio.

снимок экрана вне-диапазона ACOS вызова в SSMS

Floating Point Error in acos function

Смежные вопросы