MySQL: cómo obtener la diferencia entre dos marcas de tiempo en segundos

97

¿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?

El.Anti.9
fuente

Respuestas:

176

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 una TIMESTAMPcolumna, 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)

Daniel Vassallo
fuente
11
También puede usar TIMESTAMPDIFF , que lo hace en una sola función, simplemente configure el unitparámetro en SECOND.
Mike
+1 para la explicación del rendimiento. No estaba usando UNIX_TIMESTAMP () porque pensé que tomaría más tiempo.
elcool
51

¿Qué 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
fuente
Si su columna de fecha está en otra forma distinta a AAAA-MM-DD intente hacer esto: str_to_date(date_column, '%m/%d/%Y')dentro de la función TIMESTAMPDIFF para la columna que necesita que se corrija el formato.
majorKing
esta es una mejor respuesta para mí ya que TIME_TO_SECalcanza el máximo 3020399mientras que esto devuelve el valor correcto.
billynoah
21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

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 con TIME_TO_SEC().

Ámbar
fuente
11

Tenga en cuenta que la TIMEDIFF()solución solo funciona cuando datetimeshay menos de 35 días de diferencia. TIMEDIFF()devuelve un TIMEtipo de datos y el valor máximo de TIME es 838: 59: 59 horas (= 34,96 días)

Ingeniería de la Energía
fuente