下面的代码用于计算两个城市之间的英里数。在这种情况下,是从雅茅斯到雅茅斯的距离,很明显是零,这意味着在雅茅斯X英里范围内的城市的结果应该包括雅茅斯本身。
问题是雅茅斯的经纬度似乎引起了某种浮点问题(我在其他城市没有看到这种情况):
DECLARE @fromlong FLOAT, @fromlat FLOAT, @tolong FLOAT, @tolat FLOAT, @test FLOAT SET @fromlong = 43.8219 SET @fromlat = -70.1758 SET @tolong = 43.8219 SET @tolat = -70.1758 SET @test = SIN(@fromlong / ( 180 / PI() )) * SIN(@tolong / ( 180 / PI() )) + COS(@fromlong / ( 180 / PI() )) * COS(@tolong / ( 180 / PI() )) * COS(@fromlat / ( 180 / PI() ) - @tolat / ( 180 / PI() )) PRINT @test /*** Displays "1" ***/ SELECT 3963.0 * ACOS(@test) /*** Displays "a domain error has occurred" ***/
首先,这是一个SQL Server错误吗?
第二,我能做些什么来绕过它?我知道在上面的例子中,我可以有一些逻辑 IF @test > 1
IF @test > 1
评论中的共识似乎是使用FLOAT。我在示例中只使用了FLOAT,因为这是从中读取纬度/经度的列的数据类型,但这似乎是问题的核心。因为我无法更改列本身的数据类型,所以最简单的解决方案是更改结果计算的数据类型,这似乎在所有情况下都可以正常工作:
SELECT 3963.0 * ACOS(CONVERT(DECIMAL(10, 6), @test))