Se você já precisou encontrar a diferença entre duas datas no SQL Server, pode ter usado o
DATEDIFF()
função. Esta função retorna a quantidade de tempo entre duas datas usando um datepart especificado por você. Por exemplo, você pode usá-lo para retornar o número de dias entre a data 1 e a data 2. Você também pode fazer com que ele retorne o número de minutos, segundos, meses, anos etc. O
DATEDIFF_BIG()
A função funciona exatamente da mesma maneira, mas com uma diferença sutil:seu tipo de dados de retorno. Portanto, a diferença entre essas duas funções é o tipo de dados de seu valor de retorno.
DATEDIFF()
retorna um inteiro com sinal (int )DATEDIFF_BIG()
retorna um inteiro grande com sinal (bigint )
Em alguns casos, você não terá muita necessidade de retornar um bigint tipo de dados. Isso representa um número muito grande, e se você usa
DATEDIFF()
ou DATEDIFF_BIG()
não fará diferença (exceto para requisitos de armazenamento – int usa 4 bytes, bigint usa 8 bytes). No entanto, se você encontrar o seguinte erro:
A função dateiff resultou em um estouro. O número de partes de data que separam duas instâncias de data/hora é muito grande. Tente usar datediff com um datepart menos preciso.
É porque o valor de retorno é muito grande.
Nesse caso, você precisará fazer uma das três coisas:
- Use um período de tempo mais curto. Por exemplo, em vez de tentar retornar o número de milissegundos em 26 dias, tente 25.
- Use um datepart menos preciso . Por exemplo, em vez de tentar retornar o número de milissegundos, tente com apenas alguns segundos.
- Use o
DATEDIFF_BIG()
função em vez disso.
Às vezes, as duas primeiras opções não são adequadas. Se você precisa de um período de 26 dias, 25 não vai cortá-lo. E se você precisar de um carimbo de data/hora do Unix após 2038, encontrará problemas de 2038 se usar
DATEDIFF()
. De qualquer forma, o
DATEDIFF_BIG()
função permite uma gama muito maior de resultados do que DATEDIFF()
. Exemplo
Aqui estão dois exemplos para demonstrar as semelhanças e as diferenças entre
DATEDIFF()
e DATEDIFF_BIG()
. Mesmo resultado
Aqui está um exemplo em que ambas as funções produzem o mesmo resultado:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Resultado:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
Como esperado, ambas as funções retornam o mesmo resultado. Isso ocorre porque o valor de retorno é pequeno o suficiente para atender a grandes e int tipos de dados. Tudo o que fizemos foi retornar o número de milissegundos em 1 segundo.
Resultado diferente
Agora, aqui está o que acontece se aumentarmos o prazo para 1000 anos.
Primeiro, veja o que acontece quando usamos
DATEDIFF()
:DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
Resultado:
Error: 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.
Agora, veja como
DATEDIFF_BIG()
trata disso:DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Resultado:
DATEDIFF_BIG -------------- 31556908800000
Retornar o número de milissegundos em 1000 anos era demais para um int , mas não é um problema para um grande .