quinta-feira, 10 de novembro de 2016

MySQL: Limite dos 838:59:59 nas Operações de Tempo

Um caso que aconteceu é que eu precisava fazer uma operação em que precisava ver a duração de tempo entre dois tempos, e não pensei duas vezes em usar a função TIMESTAMPDIFF() no MySQL. Só que percebi que algumas linhas me apresentava este valor específico: 838:59:59. Achei muita coincidência ter várias linhas com a mesma duração e descobri o que temia: a função tem esse limite de quase 35 dias. 

Procurei por uma solução, mas muitas gente dava uma solução pouca prática, sendo que a solução é bem simples: Ao invés de utilizar o dado no formato de Data padrão do MySQL, convertá-os em Unix TimeStamp com a função UNIX_TIMESTAMP().

Para quem não conhece este formato de data, ele é um inteiro que conta a quantidade de segundos desde 1/1/1970, e é utilizado nos sistemas baseado em Unix e criado para justamente facilitar os cálculos relacionados ao tempo. 

Voltando a ideia original, se quisermos fazer algo equivalente ao TIMESTAMPDIFF(tempo1, tempo2), podemos fazer o seguinte:

  UNIX_TIMESTAMP(tempo2) - UNIX_TIMESTAMP(tempo1)

e problema resolvido.

Exemplo:

SELECT (UNIX_TIMESTAMP(chegada) - UNIX_TIMESTAMP(saida)) AS tempoDecorrido FROM Viagem WHERE custo>1000

Lembrando que o resultado vai sair sempre em segundos. Se precisar dos valores em horas, você deverá fazer as devidas conversões.

2 comentários: