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

Сложение значений времени

Задача
Вы хотите добавить к значению времени указанное количество секунд или сложить два значения времени.

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

Обсуждениеv
Основными инструментами выполнения арифметических операций со значениями времени являются функции TIME_TO_SEC() и SEC_TO_TIME(), преобразующие значения TIME в секунды и обратно. Чтобы добавить значение интервала времени в секундах к значению TIME, преобразуйте TIME в секунды, чтобы оба значения были представлены в одинаковых единицах измерения, затем выполните сложение и преобразуйте результат обратно в TIME. Например, два часа – это 7200 секунд (2*60*60), так что следующий запрос добавляет
два часа к каждому из значений t1 таблицы time_val:

mysql> SELECT t1,
-> SEC_TO_TIME(TIME_TO_SEC(t1) + 7200) AS 't1 plus 2 hours'
-> FROM time_val;

+----------+-----------------+
| t1 | t1 plus 2 hours |
+----------+-----------------+
| 15:00:00 | 17:00:00 |
| 05:01:30 | 07:01:30 |
| 12:30:20 | 14:30:20 |
+----------+-----------------+

Если сам интервал представлен значением TIME, его тоже следует преобразовать в секунды перед сложением. Вычислим сумму двух значений TIME из таблицы time_val:

mysql> SELECT t1, t2,
-> SEC_TO_TIME(TIME_TO_SEC(t1) + TIME_TO_SEC(t2)) AS 't1 + t2'
-> FROM time_val;

+----------+----------+----------+
| t1 | t2 | t1 + t2 |+----------+----------+----------+
| 15:00:00 | 15:00:00 | 30:00:00 |
| 05:01:30 | 02:30:20 | 07:31:50 |
| 12:30:20 | 17:30:45 | 30:01:05 |
+----------+----------+----------+

Необходимо помнить о том, что значения типа TIME в MySQL представляют собой реально прошедшее время, а не время дня, так что они не устанавливаются в 0 после достижения 24 часов. Это видно в первой и третьей строках вывода предыдущего запроса. Чтобы выводить значения времени дня, перед преобразованием секунд обратно в значение TIME выполните операцию деления по модулю. Количество секунд в дне равно 24*60*60, то есть 86 400, поэтому для преобразования любого значения секунд s к 24-часовому диапазону необходимо использовать функцию MOD() или оператор деления по модулю (%):

MOD(s,86400)
s % 86400

Эти два выражения эквивалентны. Применим первое из них в вычислении времени из предыдущего примера и получим такой результат:

mysql> SELECT t1, t2,
-> SEC_TO_TIME(MOD(TIME_TO_SEC(t1) + TIME_TO_SEC(t2), 86400)) AS 't1 + t2'
-> FROM time_val;

+----------+----------+----------+
| t1 | t2 | t1 + t2 |
+----------+----------+----------+
| 15:00:00 | 15:00:00 | 06:00:00 |
| 05:01:30 | 02:30:20 | 07:31:50 |
| 12:30:20 | 17:30:45 | 06:01:05 |
+----------+----------+----------+

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

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

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