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

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

Dos funciones de fecha incluidas en MySQL son DATEDIFF() y TIMEDIFF() .

Ambas funciones hacen algo similar, pero con algunas diferencias significativas.

La siguiente tabla resume la diferencia entre estas dos funciones:

DATEDIFF() TIMEDIFF()
El resultado se expresa como un valor en días. El resultado se expresa como un valor de tiempo.
Compara solo el valor de fecha de sus argumentos. Compara el valor temporal de sus argumentos.
Acepta expresiones de fecha o fecha y hora. Acepta expresiones de hora o de fecha y hora.
Ambos argumentos pueden ser de diferente tipo (fecha o fecha y hora). Ambos argumentos deben ser del mismo tipo (ya sea hora o fecha y hora).

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 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

Resultado:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | 24:00:00 |
+----------+----------+

Entonces podemos ver que DATEDIFF() devolvió 1 , que significa “1 día”, y TIMEDIFF() devuelto 24:00:00 que es la representación de tiempo de exactamente 1 día.

Ejemplo 2:especificar un valor de tiempo

Veamos qué sucede si aumentamos el valor de tiempo de una de las variables.

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';

Resultado:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | 36:15:35 |
+----------+----------+

Entonces DATEDIFF() devuelve el mismo resultado que en el ejemplo anterior. Esto se debe a que solo compara los valores de fecha (ignora cualquier valor de tiempo).

El TIMEDIFF() La función, por otro lado, compara el tiempo y, por lo tanto, devuelve un resultado más preciso. Nos muestra que hay 36 horas, 15 minutos y 35 segundos entre los dos valores de fecha y hora.

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 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF Date',
  DATEDIFF(@time1, @time2) AS 'DATEDIFF Time',
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';

Resultado:

+---------------+---------------+---------------+---------------+
| DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time |
+---------------+---------------+---------------+---------------+
|             1 |          NULL | 00:00:00      | 12:15:35      |
+---------------+---------------+---------------+---------------+

El primer y el último resultado están bien, porque se pasaron los tipos de argumento correctos. Sin embargo, los dos resultados del medio tenían el tipo de datos incorrecto y, por lo tanto, no se pudo calcular el resultado correcto.

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 
  DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF',
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';

Resultado:

+----------+----------+
| DATEDIFF | TIMEDIFF |
+----------+----------+
|        1 | NULL     |
+----------+----------+

Entonces podemos ver que DATEDIFF() 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 |
+----------+----------+