首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Haversine公式

SQL Haversine公式
EN

Stack Overflow用户
提问于 2016-01-07 05:48:03
回答 1查看 622关注 0票数 0
代码语言:javascript
复制
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

我一直在这个查询中得到一个错误,说发生了一个无效的浮点操作。

怎么了?

EN

回答 1

Stack Overflow用户

发布于 2016-01-07 06:17:35

您需要向acos函数传递一个有效值,即传递的值必须介于-1和+1之间。因此,以下查询将导致SQL Server中的floating point error

将导致浮点错误的查询

代码语言:javascript
复制
select acos(-1.1);
select acos(2.5);

不会导致浮点错误的查询

代码语言:javascript
复制
select acos(-1.0);
select acos(0.7);

从数学我们知道一个角度的余弦总是在-1和+1之间。

在您的情况下,您传递给acos函数的以下表达式的计算结果超出了-1到+1的范围。

代码语言:javascript
复制
@cc * ( COS(rlat) * COS(RLONG) ) + @cs * ( COS(RLAT) * SIN(RLONG) ) + @SLat * SIN(RLAT)

您可以在下面的屏幕截图中看到此无效函数调用在SQL Server Management Studio中的行为。

SSMS中超出范围的acos呼叫的屏幕截图

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34643461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档