¿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 TIMESTAMP
tipo de datos, supongo que la UNIX_TIMESTAMP()
solución sería un poco más rápida, ya que los TIMESTAMP
valores 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 unaTIMESTAMP
columna, 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
.TIME
los valores pueden oscilar entre '-838: 59: 59' a '838: 59: 59' (aproximadamente 34,96 días)
unit
pará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_SEC
alcanza el máximo3020399
mientras 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 cuandodatetimes
hay menos de 35 días de diferencia.TIMEDIFF()
devuelve unTIME
tipo de datos y el valor máximo de TIME es 838: 59: 59 horas (= 34,96 días)fuente