Хранение данных в базе MySQL довольно часто сопряжено с полями, которые хранят значения времени и временные метки. Для этих целей в MySQL существуют несколько форматов даты и времени которые могут храниться в полях таблиц.
Давайте перечислим основные поля, используемые для хранения значений времени:
DATE – тип поля который хранит дату в формате ГГГГ-ММ-ДД;
DATETIME – поле этого типа хранит дату и время, в формате ГГГГ-ММ-ДД ЧЧ:ММ:CC;
TIMESTAMP – временная метка, формат хранения зависит от версии MySQL, и режима работы сервера баз данных.
Как правило, TIMESTAMP представляет некоторое числовое значение, которое удобно использовать при фильтрации полей, традиционными операторами сравнения. Что касается формата DATETIME, то здесь уже операция фильтрации выполняется немного иначе. Давайте рассмотрим простые примеры, как можно фильтровать записи, если у вас таблица хранит данные времени в формате DATETIME.
В качестве задачи, мы рассмотрим пример выборки записей, до определённой даты, пусть это будет 24.05.2020. Для этого чтобы применить фильтрацию к полю DateTime мы воспользуемся функцией DATE():
SELECT * FROM m_table WHERE DATE(add_date) < '2020-05-24'
Данный запрос сделает выборку данных из таблицы m_table, выбирая записи, у которых значение даты в поле add_date не превышает указанное в условии. Либо аналогичным образом можно отфильтровать записи, у которых значение поле add_date больше указанной даты:
SELECT * FROM m_table WHERE DATE(add_date) > '2020-05-24'
Как вы можете заметить, поменялся только лишь оператор сравнения.
Теперь давайте рассмотрим пример с фильтрацией по диапазону. Для фильтрации мы будем использовать начальную и конечную дату. Таким образом, мы сделаем выборку записей из таблицы, соответствующие заданному диапазону:
SELECT * FROM m_table WHERE DATE(add_date) BETWEEN '2020-04-01' AND '2020-05-01'
Команда BETWEEN в запросе как раз указывает на то, что в условии будет использоваться диапазон значений.
Нередко приходится выбирать данные с использованием интервалов времени, которые могут меняться динамически. Так к примеру, мы можем выбрать записи двухнедельной давности, а также записей, дата которых больше текущей на некоторое значение.
SELECT * FROM m_table WHERE DATE(add_date) BETWEEN DATE(CURRENT_DATE() - INTERVAL 2 WEEK) AND DATE(CURRENT_DATE() + INTERVAL 4 DAY)
Опять же, здесь задействованы такие функции как DATE(), CURRENT_DATE(), а как же команды временного интервала INTERVAL. MySQL позволяет выполнять математические операции с датами, оперируя вместе с этими функциями. Так можно увеличивать или уменьшать некоторые временные значения в запросе, динамически, в зависимости от текущего значения времени.
В таблицы приведён список функций, которые могут быть использованы в запросах MySQL. Этих часть этих функций бывает достаточно чтобы сформировать запросы практически с любым условием выборки данных.
Функция | Описание |
ADDDATE() | Добавление даты |
ADDTIME() | Добавление времени |
CONVERT_TZ() | Конвертация из одной временной зоны в другую |
CURDATE() | Получение текущей даты |
CURTIME() | Получение текущего системного времени |
DATE_ADD() | Добавление одной даты к другой |
MySQL DATE_FORMAT() | Приведение даты к определённому формату |
DATE() | Получение даты из даты или выражения дата-время |
DATEDIFF() | Вычитание одной даты из другой |
DAYNAME() | Получение названия дня недели |
DAYOFMONTH() | Получения дня месяца (1-31) |
DAYOFWEEK() | Получение индекса дня недели из аргумента |
DAYOFYEAR() | Получение дня года (1-366) |
EXTRACT | Получение части даты |
FROM_DAYS() | Преобразование номер дня в дату |
FROM_UNIXTIME() | Преобразование даты в формате UNIX в дату |
MySQL DATE_SUB() | Вычитание одной даты из другой |
HOUR() | Получение часа |
LAST_DAY | Получение последнего дня месяца для аргумента |
MAKEDATE() | Создание даты из года и дня года |
MAKETIME () | Получение значения времени |
MICROSECOND() | Получение миллисекунды из аргумента |
MINUTE() | Получение минуты из аргумента |
MONTH() | Получение месяца из переданной даты |
MONTHNAME() | Получение названия месяца |
NOW() | Получение текущей даты и времени |
PERIOD_ADD() | Добавление интервала к месяцу-году |
PERIOD_DIFF() | Получение количества месяцев между двумя периодами |
QUARTER() | Получение четверти часа из переданной даты в качестве аргумента |
SEC_TO_TIME() | Конвертация секунды в формат ‘ЧЧ:MM:СС’. |
SECOND() | Получение секунды (0-59) |
MySQL STR_TO_DATE() | Преобразование строки в дату |
SUBTIME() | Вычитание времени |
SYSDATE() | Получение времени, в момент которого была выполнена функция |
TIME_FORMAT() | Установка формата времени |
TIME_TO_SEC() | Получение аргумента, преобразованного в секунды |
TIME() | Получение части времени из выражения, передаваемого в качестве аргумента |
TIMEDIFF() | Вычитание времени |
TIMESTAMP() | Получение даты или выражения дата-время если используется один аргумент. С двумя аргументами возвращается их сумма |
TIMESTAMPADD() | Добавление интервала к дате-времени |
TIMESTAMPDIFF() | Вычитание интервала из даты-времени |
TO_DAYS() | Получение аргумента даты, преобразованный в дни |
UNIX_TIMESTAMP() | Получение даты-времени в формате UNIX, в формат, допускаемый в MySQL |
UTC_DATE() | Получение текущей даты в UTC |
UTC_TIME() | Получение текущего времени в UTC |
UTC_TIMESTAMP() | Получение текущей даты-времени в UTC |
WEEK() | Получение номера недели |
WEEKDAY() | Получение индекса дня недели |
WEEKOFYEAR() | Получение календарной недели даты (1-53) |
YEAR() | Получение года |
YEARWEEK() | Получение года и недели |