Ech*_*lon 5 sql sql-server math
我有一个存储过程,它计算两个坐标对之间的距离作为浮点数.我正在尝试使用它来过滤值列表但得到算术溢出错误.查询是:
SELECT * FROM Housing h WHERE convert(float, dbo.CalculateDistance(35, -94, h.Latitude, h.Longitude)) <= 30.0
Run Code Online (Sandbox Code Playgroud)
哪个错误:
消息8115,级别16,状态6,行1算术溢出错误将float转换为数据类型numeric.
存储过程供参考:
CREATE FUNCTION [dbo].[CalculateDistance]
(@Longitude1 DECIMAL(8,5),
@Latitude1 DECIMAL(8,5),
@Longitude2 DECIMAL(8,5),
@Latitude2 DECIMAL(8,5))
RETURNS FLOAT
AS
BEGIN
DECLARE @Temp FLOAT
SET @Temp = SIN(@Latitude1/57.2957795130823) * SIN(@Latitude2/57.2957795130823) + COS(@Latitude1/57.2957795130823) * COS(@Latitude2/57.2957795130823) * COS(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823)
IF @Temp > 1
SET @Temp = 1
ELSE IF @Temp < -1
SET @Temp = -1
RETURN (3958.75586574 * ACOS(@Temp) )
END
Run Code Online (Sandbox Code Playgroud)
还尝试将结果转换为十进制,但没有效果.
您的输入是 DECIMAL(8,5)。这意味着方程由例如 组成SIN(DECIMAL(8,5) / 57.2957795130823)
。其中 57.2957795130823 不能表示为 DECIMAL(8,5)。
这意味着由于数据类型不同,您有隐含的 CAST 操作。在本例中,57.2957795130823 似乎被转换为 DECIMAL(8,5) [数字],并导致溢出。
我会推荐其中任何一个:
- 更改您的函数以将输入视为 FLOATS。即使使用数字调用该函数
- 将 57.2957795130823 更改为 57.29577
- 将 DECIMAL 显式转换为 FLOAT
归档时间: |
|
查看次数: |
19134 次 |
最近记录: |