2012-07-30 17 views
7

Ho una tabella con latitudini e longitudini di posizioni. Stavo usando con successo la clausola BETWEEN finché non ho raggiunto casi in cui i valori cercati erano identici a quelli nel database. In questi casi non sta restituendo risultati. Ecco un esempio, dove, come:MySQL - TRA l'operatore con FLOAT (10,6) funziona come> e <, invece di> = e <=

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; 

Returns:

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

Se uso il TRA CLAUSOLA (Si noti che ho anche provato 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) 

ottengo 0 risultati. Oh, cosa c'è di più, se aggiungo e/o sottrai 0,000001 a ciascun valore Ex. "BETWEEN (40.735619-0.00001)" ecc. Se faccio questo restituisce i due risultati.

raffinata, userò> = e < = ma quello che non capisco è il motivo per cui TRA agisce come> e < quando nella sua docs abbastanza chiaro:

Se espressione è maggiore di o uguale a min ed expr è inferiore o uguale a max, BETWEEN restituisce 1

risposta

6

È necessario utilizzare un tipo di dati decimali anziché un float. L'uguaglianza, e quindi tra, per i valori in virgola mobile è imprecisa

+0

Grazie! La modifica del tipo di dati in decimale (10,6) ha funzionato. Quindi immagino che cosa stava succedendo è che stava arrotondando i valori dal db up in modo che fossero al di fuori dell'intervallo e non fossero più uguali? Ciò che mi uccide è perché BETWEEN avrebbe tondo in modo diverso da "> = <=". Vai a capire. – tomwoods

1

Ho il sospetto che questo abbia a che fare con errori di arrotondamento nelle conversioni in virgola mobile. In base a the docs, l'espressione expr BETWEEN min AND max equivale a (expr <= max AND expr >= min) solo quando tutti e tre gli argomenti sono dello stesso tipo. Altrimenti, la conversione del tipo viene applicata a tutti gli argomenti. Sarebbe durante questa conversione che si verifichino errori di arrotondamento.

Problemi correlati