Задача
Вы хотите добавить к значению времени указанное количество секунд или сложить два значения времени.
Решение
Используйте функцию TIME_TO_SEC(), чтобы обеспечить представление всех значений в секундах, затем сложите их. Результат будет получен в секундах. Если вы хотите преобразовать его обратно в значение времени, используйте функцию SEC_TO_TIME().
Обсуждение
Основными инструментами выполнения арифметических операций со значениями времени являются функции 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 |
+----------+----------+----------+