Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMESTAMPDIFF():Qual é a diferença?


Este artigo analisa a diferença entre duas funções do MySQL; DATEDIFF() e TIMESTAMPDIFF() .

Ambas as funções retornam a diferença entre duas datas e/ou horas, mas o resultado é diferente entre as duas funções.

A tabela a seguir resume a diferença entre essas duas funções:
DATEDIFF() TIMESTAMPDIFF()
Requer 2 argumentos. Requer 3 argumentos.
Subtrai o 2º argumento do 1º (expr1 − expr2). Subtrai o 2º argumento do 3º (expr2 − expr1).
O resultado é expresso como um valor em dias. O resultado é expresso como a unidade fornecida pelo primeiro argumento.
Pode comparar apenas o valor de data de seus argumentos. Pode comparar o valor de data e hora de seus argumentos.


Exemplo 1 – Operação Básica


Aqui está um exemplo que demonstra como essas funções funcionam e como os resultados são diferentes, mesmo usando a mesma unidade.
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 |
+----------+---------------+

Então ambas as funções retornam a diferença em dias, porém um resultado é positivo e o outro negativo. Isso ocorre porque DATEDIFF() subtrai a segunda data da primeira, enquanto TIMESTAMPDIFF() subtrai a primeira data da segunda.

Exemplo 2 – Mudando a unidade


Como o exemplo anterior demonstra, o TIMESTAMPDIFF() permite- lhe especificar uma unidade para que os resultados sejam devolvidos como (na verdade, requer que você especifique a unidade). Por outro lado, DATEDIFF() não permite que você especifique uma unidade. Ele só retorna o resultado em dias.

Assim, poderíamos modificar o exemplo anterior para que TIMESTAMPDIFF() retorna o número de horas em vez de dias:
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 |
+----------+---------------+

Você pode ir até microssegundos:
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 |
+----------+---------------+

Exemplo 3 – Precisão


A precisão de DATEDIFF() é um dia, e TIMESTAMPDIFF() pode descer para o microssegundo. No entanto, a precisão de TIMESTAMPDIFF() (e a unidade que ele compara) ainda depende da unidade 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 |
+----------+------+-------+---------+---------+--------------+

E aqui está o resultado se incrementarmos a 2ª data em um segundo (o que traz para o dia seguinte):
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 |
+----------+------+-------+---------+---------+--------------+

Aqui está outro exemplo, desta vez vendo como fica quando retornamos meses, trimestres e anos quando a diferença é de um mês (ou 31 dias):
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 |
+----------+------+-------+---------+------+

Exemplo 4 – Tipos de argumentos errados


Ambas as funções retornam null se forem passados ​​para o tipo de argumento errado.
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 |
+----------+---------------+

Exemplo 5 – Tipos de argumentos mistos


Ambas as funções permitem que você forneça uma data como um argumento e uma data e hora como outro 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 |
+----------+---------------+