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

Como corrigir o erro “datediff function resultou em um estouro” no SQL Server


Este artigo fornece uma solução para um problema que você pode encontrar ocasionalmente ao usar o DATEDIFF() função no SQL Server.

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. O DATEDIFF() função retorna seu resultado como um int tipo de dados. O motivo pelo qual você recebeu esta mensagem é que o valor de retorno é muito grande para o int tipo de dados. Felizmente, há uma maneira fácil de corrigir isso.



A maneira mais rápida e fácil de corrigir esse problema é alternar para o DATEDIFF_BIG() função. Esta função funciona exatamente como DATEDIFF() , exceto que seu tipo de dados de retorno é um bigint assinado . Em outras palavras, ele pode lidar com números realmente grandes.

Exemplo


Vamos ver se DATEDIFF() pode nos dizer quantos milissegundos existem em mil anos:
SELECT DATEDIFF( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';

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. 

Talvez não. Parece que há muitos milissegundos para caber em um int .

Hora das grandes armas. DATEDIFF_BIG() , faça suas coisas...
SELECT DATEDIFF_BIG( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';  

Resultado:
Milliseconds in 1000 years
--------------------------
31556908800000            

Isso é melhor.

Se você ainda receber a mensagem de erro acima, deve estar tentando retornar um realmente grande número. Nesse caso, você precisará fazer pelo menos um dos seguintes:
  • Use um período de tempo mais curto.
  • Use um datepart menos preciso . Por exemplo, em vez de tentar retornar o número de milissegundos, tente com apenas alguns segundos.

Observe também que você precisará executar pelo menos o SQL Server 2016 antes de usar o DATEDIFF_BIG() função.