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