Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come risolvere l'errore "la funzione datediff ha provocato un overflow" in SQL Server

Questo articolo fornisce una soluzione a un problema che potresti incontrare occasionalmente durante l'utilizzo di DATEDIFF() funzione in SQL Server.

Se riscontri il seguente errore:

La funzione datediff ha provocato un overflow. Il numero di parti di date che separano due istanze di data/ora è troppo grande. Prova a utilizzare datediff con un datepart meno preciso.

È perché il valore restituito è troppo grande. Il DATEDIFF() la funzione restituisce il risultato come int tipo di dati. Il motivo per cui hai ricevuto questo messaggio è che il valore restituito è troppo grande per int tipo di dati. Fortunatamente c'è un modo semplice per risolvere questo problema.

Il modo più rapido e semplice per risolvere questo problema è passare a DATEDIFF_BIG() funzione. Questa funzione funziona esattamente come DATEDIFF() , tranne per il fatto che il tipo di dati restituito è un bigint con segno . In altre parole, può gestire numeri davvero grandi.

Esempio

Vediamo se DATEDIFF() può dirci quanti millisecondi sono in mille anni:

SELECT DATEDIFF( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';

Risultato:

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. 

Forse no. Sembra che ci siano troppi millisecondi per entrare in un int .

Tempo per i grossi calibri. DATEDIFF_BIG() , fai le tue cose...

SELECT DATEDIFF_BIG( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';  

Risultato:

Milliseconds in 1000 years
--------------------------
31556908800000            

È meglio.

Se ricevi ancora il messaggio di errore sopra riportato, devi provare a restituire un davvero gran numero. In tal caso dovrai eseguire almeno una delle seguenti operazioni:

  • Utilizza un periodo di tempo più breve.
  • Utilizza un datepart meno preciso . Ad esempio, invece di cercare di restituire il numero di millisecondi, provalo con pochi secondi.

Tieni inoltre presente che dovrai eseguire almeno SQL Server 2016 prima di poter utilizzare DATEDIFF_BIG() funzione.