我有这样的声明:
Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
from stores
where STORE_LATITUDE=24.6669863852163
and STORE_LONGTITUDE=46.69189453125
这句话应该返回一行,我很确定我把正确的纬度和经度放在数据库表中,但是它返回空值而不是我正在寻找的商店但我找不到我的错误STORE_LATITUDE,STORE_LONGITUDE被声明为float
答案 0 :(得分:1)
浮点值本质上是近似值。要让他们比较平等真的很难;关于“手榴弹和马蹄铁中的密切计数”的古老格言也适用于浮点计算。
我想说的是,你无法可靠地测试浮点数之间的相等性。
您需要这样的查询:
Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
from stores
where STORE_LATITUDE BETWEEN 24.6669863852163 - 0.0001
AND 24.6669863852163 + 0.0001
AND STORE_LONGTITUDE BETWEEN 46.69189453125 - 0.0001
AND 46.69189453125 + 0.0001
顺便说一下,0.0001度的纬度相当于地面约11米。您的商店位置不太可能接近那么精确,因为这是地球形状的球形假设开始分崩离析的地方。
像24.6669863852163这样的纬度数据的精度大约是11纳米,或者是一个复杂碳水化合物分子的大小或者某种类似的东西。这对于分子生物学来说很酷,但对于商店发现者来说显然有点过分了。
答案 1 :(得分:0)
浮点数不能正确保持精度,如果您需要精确的精确度,则必须使用十进制数据类型。 在上述情况下,您可以将值重新定义为十进制(38,20)以存储经度和纬度值。
如果您使用的是SQL Server 2008或更高版本,则SQL Server支持SPATIAL数据类型,它具有保存经度和纬度的功能,并且还可以在其上进行大量计算。
您可以在此处找到有关空间数据类型的更多信息http://msdn.microsoft.com/en-us/library/bb933790.aspx
答案 2 :(得分:0)
尝试使用 cast() or convert()
Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
from stores
where Convert(decimal(9,2),STORE_LATITUDE)=24.66
and Convert(decimal(9,2),STORE_LONGTITUDE)=46.69
答案 3 :(得分:0)
您的代码在Sql Server 2008中运行良好:sqlfiddle