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.