2012-07-30 12 views
7

Tengo una tabla con latitudes y longitudes de ubicaciones. Estaba usando la cláusula BETWEEN con éxito hasta que llegué a casos en los que los valores que se buscaban eran los mismos que en la base de datos. En estos casos, no devuelve resultados. Este es un ejemplo, donde como:MySQL - El operador BETWEEN con FLOAT (10,6) actúa como> y <, en lugar de> = y <=

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; 

Devuelve:

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

Si utilizo la cláusula BETWEEN (Nótese Incluso he intentado 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) 

consigo 0 resultados. Oh, qué más, si agrego y/o resta 0.000001 a cada valor Ej. "BETWEEN (40.735619-0.00001)", etc. Si lo hago, devuelve los dos resultados.

bien, voy a utilizar> = y = < pero lo que no entiendo es por qué medio está actuando como> y < cuando en el docs es bastante claro:

Si expr es mayor que o igual a min y expr es menor o igual que max, BETWEEN devuelve 1

Respuesta

6

Debe utilizar un tipo de datos decimal en lugar de un flotador. La igualdad, y por lo tanto entre, para los valores de coma flotante es impreciso

+0

Gracias! Cambiar el tipo de datos a decimal (10,6) hizo el truco. Así que supongo que lo que sucedía era que estaba redondeando los valores del db para que estuvieran fuera del rango y ya no fueran iguales. Lo que me mata es por qué BETWEEN se redondearía de forma diferente a "> = <=". Imagínate. – tomwoods

1

Sospecho que esto tiene que ver con los errores de redondeo en las conversiones de punto flotante. De acuerdo con the docs, la expresión expr BETWEEN min AND max es equivalente a (expr <= max AND expr >= min) solo cuando los tres argumentos son del mismo tipo. De lo contrario, la conversión de tipo se aplica a todos los argumentos. Sería durante esta conversión que se producirían errores de redondeo.