Сравнение даты и DATETIME в MySQL: решение ошибок

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Сравнивать даты в MySQL можно с использованием функции DATE(), обеспечивающей извлечение даты из переменной типа datetime. Сравнение ведется или со строками формата 'ГГГГ-ММ-ДД', или с другими датами при помощи операторов =, <>, >, >=. Например:

SQL
Скопировать код
SELECT * FROM table WHERE DATE(datetime_column) = '2023-04-01';

Такой запрос вернёт записи, где столбец datetime_column соответствует указанной дате, причем время не учитывается. Для сопоставления с текущей датой стоит использовать CURDATE():

SQL
Скопировать код
SELECT * FROM table WHERE DATE(datetime_column) = CURDATE();

Данный запрос вернёт строки, в которых datetime_column содержит сегодняшнюю дату.

Кинга Идем в IT: пошаговый план для смены профессии

Эффективное сравнение дат

Поработать с диапазоном дат позволяет оператор BETWEEN, который освобождает от необходимости применения нескольких условий AND:

SQL
Скопировать код
SELECT * FROM events WHERE event_date BETWEEN '2023-01-01' AND '2023-01-31';

Данный запрос выберет события, произошедшие в январе 2023 года, включая даты начала и конца указанного диапазона.

Важность точности: Date против Datetime

Если вам нужно сравнить исключительно даты, не забывайте о особенностях работы с полями типов DATETIME и TIMESTAMP. Вас выручит DATE():

SQL
Скопировать код
SELECT * FROM purchases WHERE DATE(sale_timestamp) = '2023-04-01';

Такой запрос вернёт покупки, совершенные 1 апреля 2023 года, при этом время не учитывается.

Распространенные ошибки при сравнении дат

Смешивание DATETIME и DATE может привести к ошибкам. Сравнение DATETIME со строкой даты подразумевает время 00:00:00:

SQL
Скопировать код
-- Будьте внимательны, так как при сравнении типов `DATETIME` со строками дат учитывается время.
SELECT * FROM table WHERE datetime_column = '2023-04-01';

Для предотвращения ошибок всегда извлекайте только дату для сравнения.

Визуализация

Для образного восприятия представим сравнение дат в MySQL как старт бегунов в гонке:

Markdown
Скопировать код
🏃‍♂️ Дата 1: 2023-03-01
🏃‍♂️ Дата 2: 2023-04-01
🏃‍♂️ ТЕКУЩАЯ ДАТА: 2023-03-15

Где находятся бегуны по отношению к "текущему времени"?

SQL
Скопировать код
SELECT event,
CASE
  WHEN event_date < NOW() THEN '🏁 Уже позади!'
  WHEN event_date = NOW() THEN '🚦 Прямо сейчас!'
  WHEN event_date > NOW() THEN '🔜 Еще впереди!'
END as 'Статус события'
FROM events;

Тут каждая дата получает свой статус в "гонке" времени.

Работа с временными интервалами

В работе с временными интервалами великую помощь оказывает INTERVAL. Вам не придется заботиться о рассчете даты следующего дня или даты трех месяцев назад:

SQL
Скопировать код
SELECT * FROM log WHERE entry_date > CURDATE() – INTERVAL 1 DAY;

Приведенный запрос вернет все записи за предыдущий день.

Если же необходим более точный интервал, можно контролировать его в часах, минутах и секундах:

SQL
Скопировать код
-- Это "Назад в будущее", встречайте "Сообщения последнего часа".
SELECT * FROM messages WHERE sent_time > NOW() – INTERVAL 1 HOUR;

Такой запрос покажет сообщения, отправленные за последний час.

Соблюдение единообразия при форматировании дат

Чтобы избежать ошибок при форматировании, пользуйтесь функцией DATE_FORMAT(), которая гарантированно отображает дату в нужном формате:

SQL
Скопировать код
SELECT DATE_FORMAT(dob, '%Y-%m-%d') as formatted_date FROM users;

Такой запрос отформатирует столбец dob в соответствии с ISO форматом 'ГГГГ-ММ-ДД'.

Полезные материалы

  1. MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions – прямой доступ к документации MySQL по функциям даты и времени.
  2. PHP – MySQL datetime fields and daylight savings time – Stack Overflow – обсуждение на Stack Overflow о сравнении дат и переходе на летнее время.
  3. MySQL – Disable ONLY_FULL_GROUP_BY – Stack Overflow – обход режимов сервера MySQL, которые могут влиять на сравнение дат.