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

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

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

Решение
Значения TIME являются специальным представлением простейших единиц времени – секунд, и у вас есть возможность преобразовывать одни в другие и обратно, используя функции TIME_TO_SEC() и SEC_TO_TIME().

Обсуждение
Функция TIME_TO_SEC() преобразует значение TIME в соответствующее количество секунд, а SEC_TO_TIME() делает обратное. Следующий запрос иллюстрирует простое преобразование в обоих направлениях:

mysql> SELECT t1,
-> TIME_TO_SEC(t1) AS 'TIME to seconds',
-> SEC_TO_TIME(TIME_TO_SEC(t1)) AS 'TIME to seconds to TIME'
-> FROM time_val;

+----------+-----------------+-------------------------+
| t1 | TIME to seconds | TIME to seconds to TIME |
+----------+-----------------+-------------------------+
| 15:00:00 | 54000 | 15:00:00 |
| 05:01:30 | 18090 | 05:01:30 |
| 12:30:20 | 45020 | 12:30:20 |
+----------+-----------------+-------------------------+

Чтобы выразить значения времени в минутах, часах или днях, выполните необходимое деление:

mysql> SELECT t1,
-> TIME_TO_SEC(t1) AS 'seconds',
-> TIME_TO_SEC(t1)/60 AS 'minutes',
-> TIME_TO_SEC(t1)/(60*60) AS 'hours',
-> TIME_TO_SEC(t1)/(24*60*60) AS 'days'
-> FROM time_val;

+----------+---------+---------+-------+------+
| t1 | seconds | minutes | hours | days |
+----------+---------+---------+-------+------+
| 15:00:00 | 54000 | 900.00 | 15.00 | 0.62 |
| 05:01:30 | 18090 | 301.50 | 5.03 | 0.21 |
| 12:30:20 | 45020 | 750.33 | 12.51 | 0.52 |
+----------+---------+---------+-------+------+

Если вы предпочитаете целые числа, а не значения с плавающей точкой, используйте функцию FLOOR():

mysql> SELECT t1,
-> TIME_TO_SEC(t1) AS 'seconds',
-> FLOOR(TIME_TO_SEC(t1)/60) AS 'minutes',
-> FLOOR(TIME_TO_SEC(t1)/(60*60)) AS 'hours',
-> FLOOR(TIME_TO_SEC(t1)/(24*60*60)) AS 'days'
-> FROM time_val;

+----------+---------+---------+-------+------+
| t1 | seconds | minutes | hours | days |
+----------+---------+---------+-------+------+
| 15:00:00 | 54000 | 900 | 15 | 0 |
| 05:01:30 | 18090 | 301 | 5 | 0 |
| 12:30:20 | 45020 | 750 | 12 | 0 |
+----------+---------+---------+-------+------+

Если вы передаете функции TIME_TO_SEC() значение дата-и-время, то извлекается часть времени, а дата отбрасывается. Тем самым обеспечивается ещеодин способ (в дополнение к описанным ранее в этой главе) извлечения времени из значений DATETIME и TIMESTAMP:

mysql> SELECT dt,
-> TIME_TO_SEC(dt) AS 'time part in seconds',
-> SEC_TO_TIME(TIME_TO_SEC(dt)) AS 'time part as TIME'
-> FROM datetime_val;

+---------------------+----------------------+-------------------+
| dt | time part in seconds | time part as TIME |
+---------------------+----------------------+-------------------+
| 1970-01-01 00:00:00 | 0 | 00:00:00 |
| 1987-03-05 12:30:15 | 45015 | 12:30:15 |
| 1999-12-31 09:00:00 | 32400 | 09:00:00 |
| 2000-06-04 15:45:30 | 56730 | 15:45:30 |
+---------------------+----------------------+-------------------+

mysql> SELECT ts,
-> TIME_TO_SEC(ts) AS 'time part in seconds',
-> SEC_TO_TIME(TIME_TO_SEC(ts)) AS 'time part as TIME'
-> FROM timestamp_val;

+----------------+----------------------+-------------------+
| ts | time part in seconds | time part as TIME |
+----------------+----------------------+-------------------+
| 19700101000000 | 0 | 00:00:00 |
| 19870305123015 | 45015 | 12:30:15 |
| 19991231090000 | 32400 | 09:00:00 |
| 20000604154530 | 56730 | 15:45:30 |
+----------------+----------------------+-------------------+

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

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

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