2016-09-06 4 views
3

테이블에 위도와 경도 값이 텍스트로 저장되어 있습니다. 그 위도 긴 값이다 기록의 경우 :제대로 작동하지 않습니다

+------+-------------------+--------------------+ 
| Name |  Lat  |  Long  | 
+------+-------------------+--------------------+ 
| ABC | 32.74943951828427 | -97.33141142455626 | 
+------+-------------------+--------------------+ 

내 SQL 쿼리처럼오고있다 :

SELECT * FROM Incident I WHERE 
(I.Lat BETWEEN '32.740446302225' AND '32.758432734343') 
AND 
(I.Long BETWEEN '-97.342104340547' AND '-97.320718508566') 
LIMIT 5 

하지만이 반환되는 0 행의 결과입니다. "ABC" 레코드가 테이블에 존재하지만 왜 그것을 당기고 있는지 알 수 없습니다. 문자열을 부동 소수점 숫자로 비교할 수 있습니까?

+1

더 큰 질문은 위도와 경도 값을이 방식으로 사용하는 이유입니다. 일반적으로 한 점에서 'ABC'또는 테이블의 다른 위치로 _distances_를 계산하려고합니다. –

+0

그리고 SQL 쿼리를 통해이 작업을 수행 할 수 있습니까? – asprin

+0

Google "Haversine MySQL" –

답변

4

문자열로 사용하기 때문에 발생합니다.

BETWEEN 구문은 ->value BETWEEN small_val AND big_val이지만 문자열로 사용하고 있으므로 -97.34..-97.32보다 크므로 작동하지 않습니다.

시도 :

(CAST(I.Lat as UNSIGNED) BETWEEN 32.740446302225 AND 32.758432734343) 
AND 
(CAST(I.Long as UNSIGNED) BETWEEN -97.342104340547 AND -97.320718508566) 

는 문자열 유형 열에 숫자 값을 저장 잘못입니다! 숫자 형식으로 변경하는 것이 좋습니다.

+0

나는 그것들을 문자열로 저장하고, Lat와 Long 컬럼의 데이터 타입은'varchar'입니다. – asprin

+0

숫자 데이터를 varchar로 저장하는 이유는 무엇입니까? –

+0

이것은 레거시 시스템이며 설계 단계에서 어떻게 생성되었는지 보여줍니다. 따라서 테이블 열 유형을 변경하는 것이이 단계에서 불가능할 수도 있습니다. – asprin

관련 문제