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 | +----------+---------------+