sql >> Base de Datos >  >> RDS >> Mysql

MySQL TIMEDIFF() vs TIMESTAMPDIFF():¿Cuál es la diferencia?

Este artículo analiza la diferencia entre MySQL TIMEDIFF() y TIMESTAMPDIFF() funciones.

Ambas funciones hacen algo similar, pero hay algunas diferencias significativas entre las dos.

La siguiente tabla resume la diferencia entre estas dos funciones:

TIMEDIFF() TIMESTAMPDIFF()
Requiere 2 argumentos. Requiere 3 argumentos.
Resta el segundo argumento del primero (fecha1 − fecha2). Resta el segundo argumento del tercero (fecha2 − fecha1).
El resultado se expresa como un valor de tiempo (y tiene las limitaciones del tipo de datos de tiempo). El resultado es un número entero, expresado por un número de unidades como lo proporciona el primer argumento.
Acepta expresiones de hora o fechahora. Acepta expresiones de fecha o fechahora.
Ambos argumentos deben ser del mismo tipo (ya sea hora o fechahora). Ambos argumentos pueden ser de diferente tipo (fecha o fechahora).

Ejemplo 1:diferencia básica

Aquí hay un ejemplo que demuestra la diferencia básica entre estas funciones.

SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';

Resultado:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| 24:00:00 |           -24 |
+----------+---------------+

Entonces podemos ver que TIMEEDIFF() devolvió un valor de tiempo y TIMESTAMPDIFF() devolvió un número entero.

Además, TIMEEDIFF() restó la segunda fecha de la primera, mientras que TIMESTAMPDIFF() restó la 1.ª fecha de la 2.

Ejemplo 2:cambiar la unidad

Como se mencionó, TIMESTAMPDIFF() nos permite especificar en qué unidad representar el resultado. Estos son algunos ejemplos:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';

Resultado:

+----------+-------+---------+---------+
| TIMEDIFF | Hours | Minutes | Seconds |
+----------+-------+---------+---------+
| 36:15:35 |   -36 |   -2175 | -130535 |
+----------+-------+---------+---------+

Sin embargo, esto es lo que sucede si usamos una unidad que es mayor que la diferencia horaria real:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';

Resultado:

+----------+------+-------+--------+
| TIMEDIFF | Days | Weeks | Months |
+----------+------+-------+--------+
| 36:15:35 |   -1 |     0 |      0 |
+----------+------+-------+--------+

En este caso, la diferencia horaria no fue lo suficientemente grande como para afectar los valores de la semana o el mes.

Ejemplo 3:tipos de argumentos incorrectos

Este es un ejemplo de lo que sucede cuando pasa tipos de argumentos incorrectos a cada función.

SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';

Resultado:

+---------------+--------------------+
| TIMEDIFF Date | TIMESTAMPDIFF Time |
+---------------+--------------------+
| 00:00:00      |               NULL |
+---------------+--------------------+

El TIMEDIFF() no admite el tipo de datos "fecha", por lo que devuelve 00:00:00 .

Y el TIMESTAMPDIFF() La función no admite el tipo de datos 'tiempo', por lo que devuelve NULL .

Ejemplo 4:tipos de argumentos mixtos

Esto es lo que sucede si proporciona dos tipos de datos diferentes para cada función.

SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Resultado:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| NULL     |           -24 |
+----------+---------------+

Entonces podemos ver que TIMESTAMPDIFF() maneja bien los tipos de datos mixtos (siempre que sean de fecha o de fecha y hora).

Sin embargo, TIMEDIFF() requiere que ambos argumentos sean del mismo tipo, por lo que obtenemos NULL , aunque ambos argumentos son de un tipo compatible con la función (hora y fecha y hora).

Podemos confirmar que ambos tipos son compatibles con esta función con el siguiente ejemplo:

SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime1, @thetime2) AS 'time',
  TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';

Resultado:

+----------+----------+
| time     | datetime |
+----------+----------+
| 02:00:00 | 48:00:00 |
+----------+----------+

Así que está bien, siempre y cuando ambos argumentos sean del mismo tipo (ya sea valores de hora o de fecha y hora).