Сравнение дат и времени в MySQL: корректный запрос
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
В MySQL для сравнения значений типа DATETIME
используются операторы сравнения =
, <
, >
. Если при сравнении необходимо игнорировать время, используется функция DATE()
:
-- Вы ждете бесплатные тако в указанное время? Вот как вы можете их найти!
SELECT * FROM таблица WHERE datetime_колонка = '2023-01-01 12:00:00';
-- Когда важен сам день, а время – нет
SELECT * FROM таблица WHERE DATE(datetime_колонка) = '2023-01-01';
Следует соблюдать стандартный формат времени ISO 8601 ('ГГГГ-ММ-ДД ЧЧ:ММ:СС'
).
Для работы с нестандартными форматами дат можно использовать функцию STR_TO_DATE()
для явного преобразования:
-- Если ваши даты отличаются от стандартных
SELECT * FROM таблица WHERE datetime_колонка = STR_TO_DATE('01,01,2023','%d,%m,%Y');
MySQL способен выполнять неявное преобразование строк при их сравнении с DATETIME
.
Говорите прямо: явное лучше неявного
Используйте явное преобразование, чтобы избежать ошибок:
-- Будьте точны: "Мне нравится, когда даты совместимы"
SELECT * FROM таблица WHERE datetime_колонка = CAST('2023-01-01' AS DATETIME);
Данный подход гарантирует точность сравнения и корректную работу с типом DATETIME
в MySQL.
Между двумя датами: использование BETWEEN
Для проверки вхождения в диапазон времени используйте комбинацию BETWEEN
и CAST()
:
-- Посмотрим, что происходило в январе:
SELECT * FROM таблица WHERE datetime_колонka BETWEEN CAST('2023-01-01' AS DATETIME) AND CAST('2023-01-31' AS DATETIME);
С помощью такого сравнения точно определяются значения в выбранном интервале.
Знать свои типы данных: типы имеют значение
Важно учитывать типы данных. Сравнение INT
и DATETIME
приводит к автоматическому преобразованию INT
в DATETIME
. Поэтому всегда проверяйте типы данных столбцов, с которыми работаете.
Визуализация
Сравним операции сравнения дат в MySQL с состязаниями в спорте:
| Спортсмен | Скорость | Дистанция | Время |
| -------------- | -------- | ----------- | ----------------- |
| Дата A 🏃♂️ | Быстрый | 5 км | '2023-04-01' |
| Дата B 🏃♀️ | Средний | 3 км | '2023-03-01' |
Старт 🏁: '2023-01-01'
Финиш 🎌: '2023-04-30'
Аналогия для сравнения:
**A** ближе к финишу 🎌 (A опережает B)
**B** дальше от старта 🏁 (B отстывает от A)
Таким образом, мы визуализируем понятия "ближе к будущему" и "ближе к прошлому".
За рамках основ: дополнительные сценарии сравнения
Танцы с временем
При работе с приложениями в разных временных зонах используйте CONVERT_TZ()
для синхронизации времени:
-- Временная зона может оказаться критической
SELECT * FROM таблица WHERE CONVERT_TZ(datetime_колонка,'UTC','America/New_York') = '2023-01-01 08:00:00';
Точность превыше всего
Проблемы точности времени решаются с помощью TIMESTAMP
и функций, вроде CURRENT_TIMESTAMP
:
-- Когда каждая секунда на счету:
SELECT * FROM таблица WHERE TIMESTAMPDIFF(SECOND, datetime_колонка, CURRENT_TIMESTAMP) < 60;
В данном случае выбираются записи, сделанные за последние 60 секунд.
Внимание: учтите особенности
Будьте внимательны, учитывая високосные годы и переход на летнее время. Функции вроде LAST_DAY()
помогут избежать ошибок:
-- Не дадим февралю забрать лишние дни
SELECT * FROM таблица WHERE datetime_колонка < LAST_DAY('2023-02-01');
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 14.7 Функции даты и времени — подробная документация по функциям работы с датами и временем в MySQL.
- MySQL – Функции даты и времени — пошаговое руководство по функциям MySQL для работы с датами и временем.
- SQL | Функции даты – GeeksforGeeks — вводное руководство по SQL-функциям работы с датами со множеством примеров и практических задач.