bob*_*tko 9 sql floating-point-exceptions sql-server-2008 sql-server-2008-r2
我有这个代码的奇怪问题:如果我运行它如下所示我得到错误:
发生了无效的浮点运算.
但是,如果我将参数更改@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
Run Code Online (Sandbox Code Playgroud)
Mar*_*ith 11
您正在使用的唯一函数返回域错误是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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8707 次 |
| 最近记录: |