2012-07-30 2 views
7

위도와 경도가있는 테이블이 있습니다. 나는 BETWEEN 절을 성공적으로 사용하여 데이터베이스의 값과 동일한 값을 검색하는 경우에 도달했습니다. 이 경우 결과를 반환하지 않습니다.FLOAT (10,6)을 사용하는 MySQL - 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" 

I 절 사이에 사용하는 경우는 (심지어 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) 

을 내가 공을 얻을 결과. 오, 뭐, 내가 각 값에 0.000001을 더하거나 뺀다면 Ex. "BETWEEN (40.735619-0.00001)"등.이 작업을 수행하면 두 결과가 반환됩니다.

좋아, 내가 사용하는 것> = 및 < =하지만 내가 이해하지 못하는 것은 왜>처럼 행동 사이 < 때 docs에서의 아주 명확 :

expr이보다 큰 경우 또는 min과 같고 expr이 max보다 작거나 같은 경우 BETWEEN은 1을 반환합니다.

답변

6

float가 아닌 십진수 데이터 형식을 사용해야합니다. 부동 소수점 값에 대한 동등 함과 부정확 함은 부정확합니다.

+0

고마워요! 10 진수 (10,6)로 데이터 유형을 변경하는 트릭을했다. 그래서 일어난 일은 db의 값을 반올림하여 범위 밖에 있고 더 이상 동등하지 않다는 것입니다. 왜 나를 죽이는가는 BETWEEN이 "> = <="와 다르게 둥글게되는 이유입니다. 그림을 이동. – tomwoods

1

부동 소수점 변환에서 반올림 오류가있는 것으로 생각됩니다. the docs에 따르면 표현식 expr BETWEEN min AND max은 세 개의 인수가 모두 같은 유형 인 경우에만 (expr <= max AND expr >= min)과 같습니다. 그렇지 않으면 유형 변환이 모든 인수에 적용됩니다. 이 변환 중에 라운드 오프 오류가 발생합니다.

관련 문제