我有一张有经纬度和经度的桌子。我成功地使用了BETWEEN子句,直到我遇到了搜索的值与数据库中的值相同的情况。在这些情况下,它不会返回结果。这是一个例子,其中:
SELECT
`Location`.`latitude`,
`Location`.`longitude`
FROM
`locations` AS `Location`
WHERE `latitude` >= 40.735619
AND `latitude` <= 40.736561
AND `longitude` >= -74.033882
AND `longitude` <= -74.030861;
返回:
"latitude" "longitude"
"40.736561" "-74.033882"
"40.735619" "-74.030861"
如果我使用BETWEEN CLAUSE(注意我甚至试过this):
SELECT
`Location`.`latitude`,
`Location`.`longitude`
FROM
`locations` AS `Location`
WHERE `latitude` BETWEEN LEAST(40.735619, 40.736561)
AND GREATEST(40.736561, 40.735619)
AND `longitude` BETWEEN LEAST(- 74.033882, - 74.030861)
AND GREATEST(- 74.030861, - 74.033882)
我得到0结果。哦,如果我为每个值Ex添加和/或减去0.000001,那么更多。 “BETWEEN(40.735619-0.00001)”等。如果我这样做,它会返回两个结果。
很好,我会使用&gt; =和&lt; =但我不明白为什么BETWEEN表现得像&gt;和&lt;在docs时非常清楚:
如果expr大于或等于min且expr小于或等于max,则BETWEEN返回1
答案 0 :(得分:6)
您应该使用十进制数据类型而不是浮点数。浮点值之间的相等性因此是不精确的
答案 1 :(得分:1)
我怀疑这与浮点转换中的舍入错误有关。根据{{3}},只有当所有三个参数都是相同类型时,表达式expr BETWEEN min AND max
才等同于(expr <= max AND expr >= min)
。否则,类型转换将应用于所有参数。在此转换期间,将发生舍入错误。