Categorias
Banco de dados Tutoriais

Como adicionar mais tempo a outra variável de tempo no MySQL

Como fazer operações de adição entre variáveis de valores temporais no MySQL. Como somar minutos, segundos, horas, dias etc.

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.

Por Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.