Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() no SQL Server:Qual é a diferença?


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 .