Você já tem uma variável ou um campo com um valor de tempo, definido em horas, minutos e segundos. O que você quer é adicionar valores a esta variável temporal — alguns segundos, minutos, horas ou dias a mais.
Uma das formas de resolver este problema e usar as funções de conversão do MySQL: TIME_TO_SEC() e SEC_TO_TIME().
Nesta abordagem, vamos usar TIME_TO_SEC() para ter certeza de que todos os valores envolvidos estão em segundos. Então, fazemos as operações aritméticas, cujos resultados serão apresentados em unidades de segundos.
Enfim, vamos usar a função SEC_TO_TIME() para converter de volta a valores temporais (de hora).
Tomemos como exemplo que 3 horas são equivalentes a (3*60*60) 10800 segundos — cada hora, possui 3600 segundos.
Ao adicionar mais uma hora (3600 seg.) a este valor, temos 14400 segundos.
Para transformar o valor resultante em um horário legível, usamos a função SEC_TO_TIME().
No exemplo prático, abaixo, vou mostrar como somar 3 horas ao horário original, constante nos campos de uma tabela>
SELECT TIME(DataCadastroCliente) AS "Horário original", -> SEC_TO_TIME(TIME_TO_SEC(DataCadastroCliente)+10800) as "Horário +3 horas" -> FROM CadastroClientes LIMIT 5;
+-------------------+-------------------+ | Horário original | Horário +3 horas | +-------------------+-------------------+ | 10:03:39 | 13:03:39 | | 21:44:49 | 24:44:49 | | 11:58:30 | 14:58:30 | | 20:52:29 | 23:52:29 | | 09:43:57 | 12:43:57 | +-------------------+-------------------+ 5 rows in set (0.00 sec)
Como somar dois valores expressos em horas no MySQL
Se você tem dois valores temporais expressos em horas, é necessário converter ambos para segundos, antes de somá-los.
Veja um exemplo:
SELECT HoraChegada, TempoPerm -> SEC_TO_TIME(TIME_TO_SEC(HoraChegada) + TIME_TO_SEC(TempoPerm)) AS 'Hora + Tempo' -> FROM CheckIn;
+-------------+-----------+--------------+ | HoraChegada | TempoPerm | Hora + Tempo | +-------------+-----------+--------------+ | 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 | +-------------+-----------+--------------+
Note que valores temporais no MySQL (MySQL TIME values) não representam os horários no dia. Na verdade, estes valores se referem a tempo decorrido — por isto não zeram após as 24 horas.
Use um operador de módulo para chegar ao resultado desejado, neste caso:
SELECT HoraChegada, TempoPerm -> SEC_TO_TIME(MOD(TIME_TO_SEC(HoraChegada) + TIME_TO_SEC(TempoPerm), 86400) AS 'Hora + Tempo' -> FROM CheckIn;
Note que o valor 86400, usado acima, é o número de segundos contido dentro das 24 horas de um dia. No meu caso, esta query vai retornar o seguinte resultado:
+-------------+-----------+--------------+ | HoraChegada | TempoPerm | Hora + Tempo | +-------------+-----------+--------------+ | 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 | +-------------+-----------+--------------+
No MySQL, os valores TIME se delimitam entre -838:59:59 e 838:59:59 — o que corresponde a -3020399 a
3020399 segundos.
Se você tentar armazenar valores fora desta faixa, o MySQL vai simplesmente cortar o que estiver ultrapassando os limites do permitido.