Сравнение даты и DATETIME в MySQL: решение ошибок
Быстрый ответ
Сравнивать даты в MySQL можно с использованием функции DATE()
, обеспечивающей извлечение даты из переменной типа datetime. Сравнение ведется или со строками формата 'ГГГГ-ММ-ДД'
, или с другими датами при помощи операторов =, <>, >, >=
. Например:
SELECT * FROM table WHERE DATE(datetime_column) = '2023-04-01';
Такой запрос вернёт записи, где столбец datetime_column
соответствует указанной дате, причем время не учитывается. Для сопоставления с текущей датой стоит использовать CURDATE()
:
SELECT * FROM table WHERE DATE(datetime_column) = CURDATE();
Данный запрос вернёт строки, в которых datetime_column
содержит сегодняшнюю дату.
Эффективное сравнение дат
Поработать с диапазоном дат позволяет оператор BETWEEN
, который освобождает от необходимости применения нескольких условий AND
:
SELECT * FROM events WHERE event_date BETWEEN '2023-01-01' AND '2023-01-31';
Данный запрос выберет события, произошедшие в январе 2023 года, включая даты начала и конца указанного диапазона.
Важность точности: Date против Datetime
Если вам нужно сравнить исключительно даты, не забывайте о особенностях работы с полями типов DATETIME
и TIMESTAMP
. Вас выручит DATE()
:
SELECT * FROM purchases WHERE DATE(sale_timestamp) = '2023-04-01';
Такой запрос вернёт покупки, совершенные 1 апреля 2023 года, при этом время не учитывается.
Распространенные ошибки при сравнении дат
Смешивание DATETIME
и DATE
может привести к ошибкам. Сравнение DATETIME
со строкой даты подразумевает время 00:00:00
:
-- Будьте внимательны, так как при сравнении типов `DATETIME` со строками дат учитывается время.
SELECT * FROM table WHERE datetime_column = '2023-04-01';
Для предотвращения ошибок всегда извлекайте только дату для сравнения.
Визуализация
Для образного восприятия представим сравнение дат в MySQL как старт бегунов в гонке:
🏃♂️ Дата 1: 2023-03-01
🏃♂️ Дата 2: 2023-04-01
🏃♂️ ТЕКУЩАЯ ДАТА: 2023-03-15
Где находятся бегуны по отношению к "текущему времени"?
SELECT event,
CASE
WHEN event_date < NOW() THEN '🏁 Уже позади!'
WHEN event_date = NOW() THEN '🚦 Прямо сейчас!'
WHEN event_date > NOW() THEN '🔜 Еще впереди!'
END as 'Статус события'
FROM events;
Тут каждая дата получает свой статус в "гонке" времени.
Работа с временными интервалами
В работе с временными интервалами великую помощь оказывает INTERVAL
. Вам не придется заботиться о рассчете даты следующего дня или даты трех месяцев назад:
SELECT * FROM log WHERE entry_date > CURDATE() – INTERVAL 1 DAY;
Приведенный запрос вернет все записи за предыдущий день.
Если же необходим более точный интервал, можно контролировать его в часах, минутах и секундах:
-- Это "Назад в будущее", встречайте "Сообщения последнего часа".
SELECT * FROM messages WHERE sent_time > NOW() – INTERVAL 1 HOUR;
Такой запрос покажет сообщения, отправленные за последний час.
Соблюдение единообразия при форматировании дат
Чтобы избежать ошибок при форматировании, пользуйтесь функцией DATE_FORMAT()
, которая гарантированно отображает дату в нужном формате:
SELECT DATE_FORMAT(dob, '%Y-%m-%d') as formatted_date FROM users;
Такой запрос отформатирует столбец dob
в соответствии с ISO форматом 'ГГГГ-ММ-ДД'
.
Полезные материалы
- MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions – прямой доступ к документации MySQL по функциям даты и времени.
- PHP – MySQL datetime fields and daylight savings time – Stack Overflow – обсуждение на Stack Overflow о сравнении дат и переходе на летнее время.
- MySQL – Disable ONLY_FULL_GROUP_BY – Stack Overflow – обход режимов сервера MySQL, которые могут влиять на сравнение дат.