2012-07-30 14 views
7

Mam tabelę o szerokościach i długościach geograficznych lokalizacji. Używałem klauzuli BETWEEN, dopóki nie dotarłem do przypadków, w których szukane wartości są takie same, jak te w bazie danych. W takich przypadkach nie zwraca wyników. Oto przykład, gdzie jako:MySQL - POMIĘDZY operatorem FLOAT (10,6) działa jak> i <, zamiast> = i <=

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; 

Powroty:

"latitude" "longitude" 
"40.736561" "-74.033882" 
"40.735619" "-74.030861" 

Jeśli używam MIĘDZY punkt (Zauważ, ja nawet nie próbował 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) 

otrzymuję 0 wyniki. Och, co więcej, jeśli dodaję i/lub odejmuję 0,000001 do każdej wartości Ex. "MIĘDZY (40.735619-0.00001)" itd. Jeśli to zrobię, spowoduje to zwrócenie dwóch wyników.

dzieła, użyję> = i < = ale co ja nie rozumiem dlaczego MIĘDZY działa jak> i < gdy w docs jej całkiem jasne:

Jeśli wyrażenie jest większe niż lub równy min i expr jest mniejszy lub równy max, BETWEEN zwraca 1

Odpowiedz

6

Powinieneś używać typu danych dziesiętnych, a nie liczb zmiennoprzecinkowych. Równość, a tym samym między, dla wartości zmiennoprzecinkowych jest nieprecyzyjna

+0

Dzięki! Zmiana typu danych na dziesiętne (10,6) dała podstęp. Więc domyślam się, że to było zaokrąglanie wartości z db do góry, aby były poza zasięgiem i nie były równe? Co mnie zabija, to dlaczego BETWEEN zaokrąglałoby inaczej niż "> = <=". Domyśl. – tomwoods

1

Podejrzewam, że ma to związek z błędami zaokrąglania w konwersji zmiennoprzecinkowej. Według the docs, wyrażenie expr BETWEEN min AND max jest równoważne (expr <= max AND expr >= min) tylko wtedy, gdy wszystkie trzy argumenty są tego samego typu. W przeciwnym razie konwersja typu zostanie zastosowana do wszystkich argumentów. Podczas tej konwersji wystąpiłyby błędy zaokrąglania.

Powiązane problemy