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?

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)


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


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


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.