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?
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 TIMESTAMP
tipo de dados, acho que a UNIX_TIMESTAMP()
solução seria um pouco mais rápida, pois os TIMESTAMP
valores 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
.TIME
os valores podem variar de '-838: 59: 59' a '838: 59: 59' (aproximadamente 34,96 dias)
unit
parâmetro comoSECOND
.Que tal "TIMESTAMPDIFF":
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff
fonte
str_to_date(date_column, '%m/%d/%Y')
dentro da função TIMESTAMPDIFF para a coluna que precisa de sua formatação corrigida.TIME_TO_SEC
atinge o máximo em3020399
enquanto isso retorna o valor correto.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 comTIME_TO_SEC()
.fonte
Observe que a
TIMEDIFF()
solução só funciona quandodatetimes
há menos de 35 dias de intervalo!TIMEDIFF()
retorna umTIME
tipo de dados e o valor máximo para TIME é 838: 59: 59 horas (= 34,96 dias)fonte