7

我有一张带有位置纬度和经度的表格。我成功地使用了 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 (注意我什至试过这个):

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)”等。如果我这样做,它会返回两个结果。

好吧,我将使用 >= 和 <= 但我不明白为什么 BETWEEN 表现得像 > 和 < 在文档中非常清楚:

如果 expr 大于或等于 min 并且 expr 小于或等于 max,则 BETWEEN 返回 1

4

2 回答 2

6

您应该使用十进制数据类型而不是浮点数。浮点值的相等,因此之间的相等是不精确的

于 2012-07-30T21:26:34.413 回答
1

我怀疑这与浮点转换中的舍入误差有关。根据文档,该表达式仅当所有三个参数都是相同类型时才expr BETWEEN min AND max等效。(expr <= max AND expr >= min)否则,类型转换将应用于所有参数。正是在此转换期间会发生舍入误差。

于 2012-07-30T21:28:20.710 回答