2016-09-06 9 views
3

Моя таблица имеет значения широты и долготы, сохраненные в виде текста. Для записи которого лат и длинные значения:BETWEEN не работает должным образом

+------+-------------------+--------------------+ 
| 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

Чем больше вопрос, почему вы используете свои значения широты и долготы таким образом? Как правило, вы хотите вычислить _distances_ с одной точки на ABC или в других местах в таблице. –

+0

И что может быть сделано с помощью SQL-запроса? – asprin

+0

Google «Haversine MySQL» –

ответ

4

Это происходит потому, что вы используете их как строки.

BETWEEN синтаксис ->value BETWEEN small_val AND big_val, но так как вы используете их как строки, -97.34.. больше, то -97.32 и, следовательно, он не работает.

Try:

(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

Смежные вопросы