Как преобразовать дату в MySQL unix timestamp и обратно?
MySQL - одна из самых популярных открытых СУБД. Часто возникает необходимость работать с датами и временем. Как же преобразовать дату в удобный для вычислений формат Unix Timestamp и обратно в MySQL? Узнайте в этой статье!
Основы работы с датами и временем в MySQL
Для хранения дат и времени в MySQL используются специальные типы данных:
- DATE - только дата, без времени
- DATETIME - дата и время
- TIMESTAMP - также дата и время, с автоматическим обновлением
Эти типы хранят значения в определенных текстовых форматах. Например, для DATE это YYYY-MM-DD, где YYYY - год, MM - месяц, DD - день. У каждого типа данных есть свой диапазон допустимых значений.
В некоторых случаях удобнее работать с датами и временем не в текстовом представлении, а в виде чисел. Для этого используется формат Unix Timestamp
.
Unix Timestamp - это количество секунд, прошедших с 1 января 1970 года 00:00:00 по UTC.
То есть дата и время выражаются одним числом. Это упрощает вычисления и сравнения.
Функция UNIX_TIMESTAMP()
Чтобы преобразовать значение даты/времени в MySQL в Unix Timestamp, используется функция UNIX_TIMESTAMP()
. Рассмотрим ее подробнее.
Синтаксис функции:
UNIX_TIMESTAMP([date])
Здесь в квадратных скобках указан необязательный параметр date
- преобразуемая дата и/или время. Если параметр не указан, то функция вернет текущий Unix Timestamp.
Параметр date
может быть передан в виде строки (в формате DATETIME или TIMESTAMP) или числа (в формате YYMMDD, YYMMDDHHMMSS и т.д.).
Рассмотрим примеры использования UNIX_TIMESTAMP().
Получение текущего времени в Unix Timestamp:
SELECT UNIX_TIMESTAMP();
Преобразование конкретной даты:
SELECT UNIX_TIMESTAMP('2023-01-05 14:25:10');
Результат функции UNIX_TIMESTAMP():
- Возвращается целое число, если исходная дата не содержит дробной части секунд
- Возвращается число с плавающей точкой, если дата содержит дробные секунды
- NULL при передаче некорректной даты
- 0 при передаче недопустимой даты (например, 01.01.2040)
Обратное преобразование
Чтобы преобразовать значение из Unix Timestamp обратно в формат даты и времени, используется функция FROM_UNIXTIME().
Например:
SELECT FROM_UNIXTIME(1672945710);
Результат:
2023-01-05 14:15:10
Рассмотрим типичные задачи, которые решаются в MySQL с помощью Unix Timestamp.
Хранение временных данных
В таблицах MySQL можно хранить числовые значения Unix Timestamp. Для этого используются целочисленные типы данных INT, BIGINT и т.д. Например, так можно хранить время событий в каком-либо приложении:
CREATE TABLE events ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), event_time BIGINT );
Затем данные можно записывать, используя UNIX_TIMESTAMP():
INSERT INTO events (name, event_time) VALUES ('page_open', UNIX_TIMESTAMP('2023-01-07 10:03:25')), ('add_to_cart', UNIX_TIMESTAMP(NOW()));
А для вывода применить обратное преобразование:
SELECT id, name, FROM_UNIXTIME(event_time) AS event FROM events;
Группировка и агрегация данных по периодам времени
Числовой формат позволяет эффективно группировать записи по периодам времени. Например, можно посчитать количество событий помесячно:
SELECT YEAR(FROM_UNIXTIME(event_time)) AS year, MONTH(FROM_UNIXTIME(event_time)) AS month, COUNT(*) AS events FROM events GROUP BY year, month ORDER BY year, month;
Аналогично можно группировать по дням, часам и т.д.
Вычисления и сравнение
Можно выполнять арифметические операции над значениями дат и интервалов времени. Например, найти время через 5 дней от текущего момента:
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP() + 5*24*60*60);
Или определить разницу во времени между двумя событиями:
SELECT e1.name AS event_1, e2.name AS event_2, e2.event_time - e1.event_time AS seconds_diff FROM events e1 JOIN events e2 ON e1.id = e2.id - 1;
event_1 | event_2 | seconds_diff |
page_open | add_to_cart | 360 |
То есть между событиями прошло 360 секунд.