Как сравнить даты в MySQL? - PullRequest
       29

Как сравнить даты в MySQL?

2 голосов
/ 27 октября 2011

У меня есть таблица (названная tasks) со столбцом created_at, которая, в основном, содержит метку времени UNIX.

Мне нужно выбрать только те результаты, которые созданы за указанный промежуток времени.

Интервалы today, tomorrow, this week и this month.

Я думаю, что если я конвертирую метку времени в формат YYYY-MM-DD HH:MM:SS, MySQL справится с этим.

Кроме того, я думаю, что мне также нужно использовать BETWEEN.

Итак, я передаю метку времени для запроса и сравниваю (проверяю?), Что она находится в указанном интервале с меткой времени, которая хранится в базе данных. Для конвертации мне нужно использовать FROM_UNIXTIME, верно?

Как указать эти интервалы? Спасибо за совет!

Ответы [ 2 ]

7 голосов
/ 27 октября 2011

Вам нужно конвертировать UNIX_TIMESTAMP.

Запрос

SELECT * FROM tasks
WHERE created_at BETWEEN UNIX_TIMESTAMP(DATE_SUB(now(),INTERVAL 1 DAY)) 
                     AND UNIX_TIMESTAMP(now())

Вы можете изменить интервал для недели, месяца и т. Д., Выполнив:

INTERVAL 1 WEEK
INTERVAL 1 MONTH
INTERVAL 1 YEAR

MySQL автоматически учитывает продолжительность месяцев, високосных лет и т. Д.

В приведенном выше запросе MySQL сможет использовать индекс, что значительно ускорит процесс.
Убедитесь, что не , чтобы использовать функцию для вашего столбца, потому что в этом случае MySQL не может использовать индекс для этого поля, что вызывает большую медлительность.

Код ужаса, очень медленно

SELECT * FROM tasks 
WHERE FROM_UNIXTIME(created_at) BETWEEN DATE_SUB(now(),INTERVAL 1 DAY) 
                                    AND now()

См .: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

1 голос
/ 27 октября 2011

Я полагаю, что создан__ определен как INT, и вы храните в нем метки времени.Тогда лучший способ, скажем, на сегодня, будет:

created_at BETWEEN UNIX_TIMESTAMP(CURDATE()) AND UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)

Обратите внимание, что ниже также будет работать:

FROM_UNIXTIME(created_at) BETWEEN CURDATE() AND (CURDATE() + INTERVAL 1 DAY)

, но у вас, вероятно, не будет шансов заставить MySQL использовать индексы столбцов.Для недели / месяца вам понадобится более сложная логика со встроенными функциями WEEK () и MONTH () (чтобы получить метку времени первой секунды текущей недели / месяца).

...