Database.Guide
On enero 27, 2022 by adminEste artículo analiza la diferencia entre dos funciones de MySQL; DATEDIFF()
y TIMESTAMPDIFF()
.
Ambas funciones devuelven la diferencia entre dos fechas y/o 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 2º argumento del 1º (expr1 – expr2). | Resta el 2º argumento del 3º (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 sólo el valor de la fecha de sus argumentos. | Puede comparar el valor de la fecha y la hora de sus argumentos. |
Ejemplo 1 – Operación básica
Aquí hay un ejemplo que demuestra cómo funcionan estas funciones, y cómo los resultados son diferentes, incluso cuando se utiliza 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 |+----------+---------------+
Así que 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, el TIMESTAMPDIFF()
permite especificar una unidad para que los resultados sean devueltos como (de hecho, requiere que se especifique la unidad). Por otro lado, DATEDIFF()
no permite especificar una unidad. Sólo devuelve el resultado en días.
Así que podríamos modificar el ejemplo anterior para que TIMESTAMPDIFF()
devuelva 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 |+----------+---------------+
Puede 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 de un día, y TIMESTAMPDIFF()
puede llegar hasta el 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 este es el resultado si incrementamos la 2ª 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í tenemos otro ejemplo, esta vez viendo cómo queda cuando devolvemos meses, trimestres y años cuando la diferencia es de 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 argumento erróneos
Ambas funciones devuelven null si se les pasa el tipo de argumento equivocado.
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 permiten proporcionar una fecha como un argumento y un datetime 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 |+----------+---------------+
Deja una respuesta