SQL - поле char с датой - как искать между двумя датами
У меня простая проблема с запросом SQL. Я хотел бы искать поля, где даты начинаются и заканчиваются в определенную дату и время.
Поле определено как CHAR и имеет структуру: ДД.ММ.ГГГГ чч: мм: сс, и я не могу его изменить.
Я попытался объявить некоторые переменные и выполнить поиск по ним, также попытался преобразовать.
Это то, что я пытался и не работал:
SELECT date FROM table WHERE date BETWEEN '1.01.2017 00:00:00' AND '1.02.2017 23:59:59'
SELECT date FROM table WHERE date >= '1.01.2017 00:00:00' AND date <= '1.02.2017 00:00:00'
SELECT date FROM table WHERE date >= Convert(DATETIME, '1.01.2017', 104) AND date <= Convert(DATETIME, '1.02.2017', 104)
Всегда после этого запроса я получаю все даты, а не то, что я спросил.
3 ответа
Я решил свою проблему. Проблема была в том, КАК эти поля хранятся в БД. Я думал, что они хранения, как: ДД.ММ.ГГГГ чч: мм: сс, но это была только структура. В БД они хранятся как: ГГГГММДДччммсс и после изменений в строке запроса WHERE это работает.
SELECT date FROM table WHERE date >= '20170101000000' AND date <= '20170101235959'
Ваше поле не в формате, который можно сравнить лексикографически как строки, поэтому вам необходимо преобразовать его в дату. Но это не в том формате, который MySQL может анализировать по умолчанию (он ожидает даты в формате YYYY-MM-DD
). Так что используйте STR_TO_DATE()
разобрать его со строкой формата.
SELECT date
FROM table
WHERE STR_TO_DATE(date, '%d.%m.%Y %H:%i:%s') BETWEEN '2017-01-01 00:00' AND '2017-01-02 23:59:59'
SELECT date FROM table WHERE STR_TO_DATE(date, '%d.%m.%Y %H:%i:%s') BETWEEN '2017-01-01 00:00:00' AND '2017-02-01 23:59:59'
ИЛИ ЖЕ
Ты можешь использовать STR_TO_DATE()
функция.
SELECT date FROM table WHERE STR_TO_DATE(date, '%d.%m.%Y %H:%i:%s') BETWEEN STR_TO_DATE('1.01.2017 00:00:00','%d.%m.%Y %H:%i:%s') AND STR_TO_DATE('1.02.2017 23:59:59','%d.%m.%Y %H:%i:%s')
Вы можете попробовать запрос выше. Надеюсь, что это поможет вам.