MySQL: como obter a diferença entre dois carimbos de data / hora em segundos

97

Existe uma maneira de fazer uma consulta no MySQL que me dê a diferença entre dois carimbos de data / hora em segundos ou eu precisaria fazer isso em PHP? E se sim, como eu faria para fazer isso?

The.Anti.9
fonte

Respostas:

176

Você pode usar TIMEDIFF()as TIME_TO_SEC()funções e da seguinte maneira:

SELECT TIME_TO_SEC(TIMEDIFF('2010-08-20 12:01:00', '2010-08-20 12:00:00')) diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

Você também pode usar a UNIX_TIMESTAMP()função como @Amber sugerido em outra resposta:

SELECT UNIX_TIMESTAMP('2010-08-20 12:01:00') - 
       UNIX_TIMESTAMP('2010-08-20 12:00:00') diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

Se você estiver usando o TIMESTAMPtipo de dados, acho que a UNIX_TIMESTAMP()solução seria um pouco mais rápida, pois os TIMESTAMPvalores já estão armazenados como um inteiro representando o número de segundos desde a época ( Fonte ). Citando os documentos :

Quando UNIX_TIMESTAMP()é usado em umTIMESTAMP coluna, a função retorna o valor do carimbo de data / hora interno diretamente, sem conversão implícita de “string para carimbo de data / hora Unix”.

Lembre-se de que o TIMEDIFF() tipo de dado de retorno deTIME . TIMEos valores podem variar de '-838: 59: 59' a '838: 59: 59' (aproximadamente 34,96 dias)

Daniel Vassallo
fonte
11
Você também pode usar TIMESTAMPDIFF , que faz isso em uma única função - basta definir o unitparâmetro como SECOND.
Mike de
1 para a explicação do desempenho. Eu não estava usando UNIX_TIMESTAMP () porque achei que demoraria mais.
elcool
51

Que tal "TIMESTAMPDIFF":

SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff

David
fonte
Se sua coluna de data estiver em outro formato diferente de AAAA-MM-DD, tente fazer isso: str_to_date(date_column, '%m/%d/%Y')dentro da função TIMESTAMPDIFF para a coluna que precisa de sua formatação corrigida.
Rei
esta é uma resposta melhor para mim, já que TIME_TO_SECatinge o máximo em 3020399enquanto isso retorna o valor correto.
billynoah
21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Se você quiser uma diferença sem sinal, adicione um ABS() ao redor da expressão.

Como alternativa, você pode usar TIMEDIFF(ts1, ts2)e converter o resultado de tempo em segundos com TIME_TO_SEC().

Âmbar
fonte
11

Observe que a TIMEDIFF()solução só funciona quando datetimesmenos de 35 dias de intervalo! TIMEDIFF()retorna um TIMEtipo de dados e o valor máximo para TIME é 838: 59: 59 horas (= 34,96 dias)

Engenharia de Energia
fonte