2013-05-20 3 views
8

У меня есть таблица Mysql, которая используется для файла журнала в этой таблице, есть поле под названием «log_date». Оно хранит дату в следующем формате (% Y-% m-% d % H:% i.% S). В БД даты выглядят как-то в этом 2013-20-05 00: 00.00. Допустим, сегодняшняя дата - 2013-20-05. И у меня есть файлы журналов с 2013-01-01 по сегодняшний день. Если я выполнить запрос так:Фильтр по дате времени Форматирование MYSQL

SELECT * FROM log_table 
WHERE STR_TO_DATE(log_date, '%Y-%m-%d %H:%i.%s') < '2013-05-05 00:00.00' 

Это возвращает все строки в БД, включая строки, которые больше 2013-05-05 00: 00.00

И если я повернуть вспять < (менее) к> (больше чем) с запросом, который выглядит следующим образом:

SELECT * FROM log_table 
WHERE STR_TO_DATE(log_date, '%Y-%m-%d %H:%i.%s') > '2013-05-05 00:00.00' 

затем он возвращает нулевое значение строки. Я думаю, что временная метка является тем, что вызывает проблему, с которой я работал с форматом даты, но не с форматом DateTime. Почему это происходит?

+0

Каков тип данных для 'log_date'? – Kermit

ответ

14

log_date должен быть типа данных DateTime. Гораздо проще использовать функцию MySQL DATE. Некоторые примеры

SELECT * FROM log_table 
WHERE DATE(log_date) < '2013-05-05' 

SELECT * FROM log_table 
WHERE DATE(log_date) > '2013-05-05' 

SELECT * FROM log_table 
WHERE DATE(log_date) BETWEEN '2013-04-05' AND '2013-05-05' 

SELECT * FROM log_table 
WHERE DATE(log_date) BETWEEN DATE(CURRENT_DATE() - INTERVAL 2 WEEK) AND 
DATE(CURRENT_DATE() + INTERVAL 4 DAY) 
+0

Это может быть проще, но это не эффективно. Я тебе +1, если ты скажешь мне, почему. – Kermit

+1

хорошо, плохо стреляй :). невозможно использовать индексы со встроенными функциями в предложении WHERE – blotto

+4

+1 ding ding ding – Kermit

0

Вы можете попробовать с этим ..

WHERE DATE_FORMAT(AUCTION_DATE, '%Y%m%d') >= DATE_FORMAT('2013/5/18', '%Y%m%d') 

Вы также можете получить дату сегодня с помощью сейчас() функция.

+1

Вы не должны этого делать: 'DATE_FORMAT()' вычисляется для каждой строки вместо проверки на константу, которая 'DATE_FORMAT ('2013/5/18', '% Y% m% d ') '. Поэтому вам лучше: 'WHERE AUCTION_DATE> = DATE_FORMAT ('2013/5/18', '% Y% m% d')', который может использовать индексы. – Yvan

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