MySQL / 5. Работа с датами и временем

Преобразование значений дата-и-время в секунды и обратно

Задача
У вас есть значение дата-и-время, а требуется значение в секундах, или наоборот.

Решение
Функции UNIX_TIMESTAMP() и FROM_UNIXTIME() преобразуют значения DATETIME и TIMESTAMP, начиная с 1970 года и заканчивая приблизительно 2037 годом, в количество секунд, прошедших с начала 1970 года, и обратно. Преобразование в секунды делает значения более точными, чем при преобразовании в дни, но ценой более узкого диапазона исходных значений.

Обсуждение
При работе со значениями дата-и-время вы можете использовать функции TO_DAYS() и FROM_DAYS() для преобразования дат в дни и наоборот, как было показано в предыдущем разделе. Для дат, не относящихся к периоду, предшествующему 1970-01-01 00:00:00 по Гринвичу (GMT), и не более поздних, чем приблизительно 2037 год1, предоставлена возможность достижения более высокой точности за счет преобразования в секунды и обратно. Функция UNIX_TIMESTAMP() преобразует значения дата-и-время в количество секунд, прошедших с начала 1970 года, а FROM_UNIXTIME() выполняет обратную операцию:

mysql> SELECT dt,
-> UNIX_TIMESTAMP(dt) AS seconds,
-> FROM_UNIXTIME(UNIX_TIMESTAMP(dt)) AS timestamp
-> FROM datetime_val;

+---------------------+-----------+---------------------+
| dt | seconds | timestamp |
+---------------------+-----------+---------------------+
| 1970-01-01 00:00:00 | 21600 | 1970-01-01 00:00:00 |
| 1987-03-05 12:30:15 | 541967415 | 1987-03-05 12:30:15 |
| 1999-12-31 09:00:00 | 946652400 | 1999-12-31 09:00:00 |
| 2000-06-04 15:45:30 | 960151530 | 2000-06-04 15:45:30 |
+---------------------+-----------+---------------------+

Упоминание о UNIX в названиях функций и отсчет значений от 1970 года объясняется тем, что 1970-01-01 00:00:00 по Гринвичу – это начало «эпохи UNIX», точка отсчета для измерений времени в UNIX-системах.2 Теперь, когда вы это знаете, может показаться странным то, что в предыдущем примере UNIX_TIMESTAMP() выводит значение 21600 для первого значения таблицы datetime_val. В чем дело? Почему не 0? Это противоречие – только кажущееся.

Дело в том, что сервер MySQL при отображении значений преобразует их к своему часовому поясу. Мой сервер работает в часовом поясе U.S. Central Time, который на шесть часов (то есть на 21600 секунд) западнее Гринвича.

Функция UNIX_TIMESTAMP() может преобразовывать значения DATE в секунды, при этом они трактуются как содержащие неявную часть времени 00:00:00:

mysql> SELECT CURDATE(), FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE()));

+------------+------------------------------------------+
| CURDATE() | FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE())) |
+------------+------------------------------------------+
| 2002-07-15 | 2002-07-15 00:00:00 |
+------------+------------------------------------------+

Статьи по MySQL на эту тему:

Выбор записей по временным характеристикам
Вывод значений TIMESTAMP в удобном для чтения виде
Вычисление возраста
Вычисление длины месяца
Вычисление интервалов между значениями времени

Вернуться в раздел: MySQL / 5. Работа с датами и временем