¿Hay alguna manera de hacer una consulta en MySQL que me dé la diferencia entre dos marcas de tiempo en segundos, o tendría que hacerlo en PHP? Y si es así, ¿cómo lo haría?
Puede utilizar TIMEDIFF()las TIME_TO_SEC()funciones y las siguientes:
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)
También puede usar la UNIX_TIMESTAMP()función como @Amber sugirió en otra respuesta:
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)
Si está utilizando el TIMESTAMPtipo de datos, supongo que la UNIX_TIMESTAMP()solución sería un poco más rápida, ya que los TIMESTAMPvalores ya están almacenados como un número entero que representa el número de segundos desde la época ( Fuente ). Citando los documentos :
Cuando
UNIX_TIMESTAMP()se utiliza en unaTIMESTAMPcolumna, la función devuelve el valor de la marca de tiempo interna directamente, sin conversión implícita de "cadena a marca de tiempo Unix".Tenga en cuenta que
TIMEDIFF()devuelve el tipo de datosTIME.TIMElos valores pueden oscilar entre '-838: 59: 59' a '838: 59: 59' (aproximadamente 34,96 días)
unitparámetro enSECOND.¿Qué tal "TIMESTAMPDIFF":
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff
fuente
str_to_date(date_column, '%m/%d/%Y')dentro de la función TIMESTAMPDIFF para la columna que necesita que se corrija el formato.TIME_TO_SECalcanza el máximo3020399mientras que esto devuelve el valor correcto.Si desea una diferencia sin signo, agregue un
ABS()alrededor de la expresión.Alternativamente, puede usar
TIMEDIFF(ts1, ts2)y luego convertir el resultado de tiempo en segundos conTIME_TO_SEC().fuente
Tenga en cuenta que la
TIMEDIFF()solución solo funciona cuandodatetimeshay menos de 35 días de diferencia.TIMEDIFF()devuelve unTIMEtipo de datos y el valor máximo de TIME es 838: 59: 59 horas (= 34,96 días)fuente