Base de dados.Guide
On Janeiro 27, 2022 by adminEste artigo analisa a diferença entre duas funções MySQL; DATEDIFF()
e TIMESTAMPDIFF()
.
Algumas funções retornam a diferença entre duas datas e/ou horas, mas o resultado é diferente entre as duas funções.
A tabela seguinte resume a diferença entre estas 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). |
Resultado é expresso como um valor em dias. | Resultado é expresso como a unidade fornecida pelo primeiro argumento. |
Pode comparar apenas o valor da data dos seus argumentos. | Pode comparar o valor da data e hora dos seus argumentos. |
Exemplo 1 – Operação Básica
Aqui está um exemplo que demonstra como estas funções funcionam, e como os resultados são diferentes, mesmo quando se usa 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. Isto 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 especificar uma unidade para os resultados a serem retornados como (de fato, 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.
Então poderíamos modificar o exemplo anterior para que TIMESTAMPDIFF()
devolva 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 |+----------+---------------+
Pode ir até aos 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()
é de um dia, e TIMESTAMPDIFF()
pode descer até ao microssegundo. No entanto a precisão de TIMESTAMPDIFF()
(e a unidade que 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 a leva ao 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 Argumento Errados
Todas as funções retornam nulas se forem passadas 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
As duas funções permitem fornecer uma data como um argumento e uma data/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 |+----------+---------------+
Deixe uma resposta