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

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

Este artículo analiza la diferencia entre dos funciones de MySQL; DATEDIFF() y TIMESTAMPDIFF() .

Ambas funciones devuelven la diferencia entre dos fechas y/u horas, pero el resultado es diferente entre las dos funciones.

La siguiente tabla resume la diferencia entre estas dos funciones:

DATEDIFF() TIMESTAMPDIFF()
Requiere 2 argumentos. Requiere 3 argumentos.
Resta el segundo argumento del primero (expr1 − expr2). Resta el segundo argumento del tercero (expr2 − expr1).
El resultado se expresa como un valor en días. El resultado se expresa como la unidad proporcionada por el primer argumento.
Puede comparar solo el valor de fecha de sus argumentos. Puede comparar el valor de fecha y hora de sus argumentos.

Ejemplo 1:funcionamiento básico

Aquí hay un ejemplo que demuestra cómo funcionan estas funciones y cómo los resultados son diferentes, incluso cuando se usa la misma unidad.

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

Resultado:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |            -1 |
+----------+---------------+

Entonces, ambas funciones devuelven la diferencia en días, sin embargo, un resultado es positivo y el otro negativo. Esto se debe a que DATEDIFF() resta la segunda fecha de la primera, mientras que TIMESTAMPDIFF() resta la primera fecha de la segunda.

Ejemplo 2:cambiar la unidad

Como demuestra el ejemplo anterior, TIMESTAMPDIFF() le permite especificar una unidad para que se devuelvan los resultados (de hecho, requiere usted para especificar la unidad). Por otro lado, DATEDIFF() no le permite especificar una unidad. Solo devuelve el resultado en días.

Entonces podríamos modificar el ejemplo anterior para que TIMESTAMPDIFF() devuelve el número de horas en lugar de días:

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

Resultado:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |           -24 |
+----------+---------------+

Puedes llegar hasta los microsegundos:

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

Resultado:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |  -86400000000 |
+----------+---------------+

Ejemplo 3:precisión

La precisión de DATEDIFF() es un día, y TIMESTAMPDIFF() puede bajar al microsegundo. Sin embargo, la precisión de TIMESTAMPDIFF() (y la unidad que compara) sigue dependiendo de la unidad especificada.

SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-10 23:59:59';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds',
  TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';

Resultado:

+----------+------+-------+---------+---------+--------------+
| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |
+----------+------+-------+---------+---------+--------------+
|        0 |    0 |    23 |    1439 |   86399 |  86399000000 |
+----------+------+-------+---------+---------+--------------+

Y aquí está el resultado si incrementamos la segunda fecha en un segundo (lo que la lleva al día siguiente):

SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-11 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds',
  TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';

Resultado:

+----------+------+-------+---------+---------+--------------+
| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |
+----------+------+-------+---------+---------+--------------+
|       -1 |    1 |    24 |    1440 |   86400 |  86400000000 |
+----------+------+-------+---------+---------+--------------+

Aquí hay otro ejemplo, esta vez viendo cómo se ve cuando devolvemos meses, trimestres y años cuando la diferencia es un mes (o 31 días):

SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-11-10 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Month',
  TIMESTAMPDIFF(quarter, @date1, @date2) AS 'Quarter',
  TIMESTAMPDIFF(year, @date1, @date2) AS 'Year';

Resultado:

+----------+------+-------+---------+------+
| DATEDIFF | Days | Month | Quarter | Year |
+----------+------+-------+---------+------+
|      -31 |   31 |     1 |       0 |    0 |
+----------+------+-------+---------+------+

Ejemplo 4:tipos de argumentos incorrectos

Ambas funciones devuelven un valor nulo si se les pasa el tipo de argumento incorrecto.

SET @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  DATEDIFF(@time1, @time2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';

Resultado:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|     NULL |          NULL |
+----------+---------------+

Ejemplo 5:tipos de argumentos mixtos

Ambas funciones le permiten proporcionar una fecha como un argumento y una fecha y hora como otro argumento.

SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Resultado:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |            -1 |
+----------+---------------+