No SQL Server, você pode usar o T-SQL
DATEDIFF()
função para retornar a diferença entre duas datas/horas. Funciona em qualquer expressão que possa ser resolvida em um tempo , data , pequena data e hora , datahora , datahora2 , ou deslocamento de data e hora valor. Este artigo fornece exemplos do
DATEDIFF()
função no SQL Server. Sintaxe
Primeiro, aqui está a sintaxe:
DATEDIFF ( datepart , startdate , enddate )
Onde datepart é a parte da data que você deseja comparar. data de início é a primeira data e data final é a data final.
A maneira como funciona é que ele retorna a contagem (como um valor inteiro assinado) do datepart especificado limites cruzados entre a data de início especificada e data de término .
Exemplo 1
Aqui está um exemplo básico onde descobrimos o número de dias entre duas datas:
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;
Resultado:
+----------+ | Result | |----------| | 365 | +----------+
Exemplo 2
Aqui está outro exemplo onde eu declaro duas variáveis e atribuo duas datas diferentes a elas (eu uso
DATEADD()
para adicionar 1 ano à primeira data). Eu então uso DATEDIFF()
para retornar várias partes de data para essa data:DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1, @date1); SELECT DATEDIFF( year, @date1, @date2 ) AS Years, DATEDIFF( quarter, @date1, @date2 ) AS Quarters, DATEDIFF( month, @date1, @date2 ) AS Months, DATEDIFF( week, @date1, @date2 ) AS Weeks, DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF( day, @date1, @date2 ) AS Days;
Resultado:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366 | +---------+------------+----------+---------+-------------+--------+
Exemplo 3
Como mencionado, você também pode retornar as partes de tempo entre as datas. Aqui está um exemplo de como retornar o número de horas, minutos e segundos entre os valores de data/hora:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1); SELECT DATEDIFF( hour, @date1, @date2 ) AS Hours, DATEDIFF( minute, @date1, @date2 ) AS Minutes, DATEDIFF( second, @date1, @date2 ) AS Seconds;
Resultado:
+---------+-----------+-----------+ | Hours | Minutes | Seconds | |---------+-----------+-----------| | 1 | 60 | 3600 | +---------+-----------+-----------+
Exemplo 4
E aqui está um exemplo de como obter o número de milissegundos, microssegundos e nanossegundos entre dois valores de data/hora:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
Resultado:
+----------------+----------------+---------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+----------------+---------------| | 1 | 1000 | 1000000 | +----------------+----------------+---------------+
Exemplo 5 – Erro!
Se você tentar fazer algo extremo, como retornar o número de nanossegundos em 100 anos, receberá um erro. Isso ocorre porque
DATEDIFF()
retorna um int valor, e há mais nanossegundos em 100 anos do que o int tipo de dados pode manipular. Então aqui está o que acontece se você tentar fazer isso:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
Resultado:
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
Felizmente, se você realmente precisa descobrir quantos nanossegundos existem em 100 anos, você pode usar o
DATEDIFF_BIG()
função em vez disso. Esta função retorna um bigint assinado tipo de dados, que permite retornar valores muito maiores que DATEDIFF()
posso. Exemplo 6 – Obtendo resultados estranhos?
Os resultados que você obtém de
DATEDIFF()
às vezes pode parecer completamente errado se você não souber como a função realmente funciona. Por exemplo:
DECLARE @startdate datetime2 = '2016-01-01 00:00:00.0000000', @enddate datetime2 = '2016-12-31 23:59:59.9999999'; SELECT DATEDIFF(day, @startdate, @enddate) Days, DATEDIFF(year, @startdate, @enddate) Years;
Resultado:
+--------+---------+ | Days | Years | |--------+---------| | 365 | 0 | +--------+---------+
Se você não sabe como
DATEDIFF()
realmente funciona, esse resultado pode parecer tão errado, que você seria perdoado por assumir que é um bug. Mas não é um bug. Confira DATEDIFF() retorna resultados errados no SQL Server? Leia isso. para ver este exemplo e outros casos em que os resultados podem parecer completamente errados, mas estar perfeitamente corretos (e para uma explicação sobre por que eles têm essa aparência).
Um dos exemplos nessa página provavelmente vale a pena mencionar novamente aqui.
DATEDIFF()
realmente ignora seu SET DATEFIRST
valor. Isso pode resultar em resultados inesperados, especialmente se você estiver em uma cultura que não usa o domingo como o primeiro dia da semana. Confira esta solução alternativa para DATEDIFF() Ignorando SET DATEFIRST no SQL Server se achar que isso pode afetá-lo.