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です。ああ、さらに、各値に0.000001を加算および/または減算すると、例。"BETWEEN(40.735619-0.00001)"など。これを行うと、2つの結果が返されます。

わかりました。>=と<=を使用しますが、ドキュメントで非常に明確な場合に、BETWEENが>と<のように動作する理由がわかりません。

exprがmin以上で、exprがmax以下の場合、BETWEENは1を返します。

4

2 に答える 2

6

floatではなくdecimalデータ型を使用する必要があります。浮動小数点値の等式、つまりその間の値は不正確です

于 2012-07-30T21:26:34.413 に答える
1

これは、浮動小数点変換の丸め誤差に関係していると思われます。ドキュメントによると、式は3つの引数すべてが同じ型である場合expr BETWEEN min AND maxにのみ同等です。(expr <= max AND expr >= min)それ以外の場合、型変換はすべての引数に適用されます。丸め誤差が発生するのは、この変換中です。

于 2012-07-30T21:28:20.710 に答える