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

DATEDIFF() vs DATEDIFF_BIG() in SQL Server:qual è la differenza?

Se hai mai avuto bisogno di trovare la differenza tra due date in SQL Server, potresti aver usato il DATEDIFF() funzione. Questa funzione restituisce la quantità di tempo tra due date utilizzando un datepart specificato da te. Ad esempio, puoi utilizzarlo per restituire il numero di giorni tra la data 1 e la data 2. Puoi anche farlo restituire il numero di minuti, secondi, mesi, anni e così via.

Il DATEDIFF_BIG() La funzione funziona esattamente allo stesso modo, ma con una sottile differenza:il tipo di dati di ritorno.

Quindi la differenza tra queste due funzioni è il tipo di dati del loro valore restituito.

  • DATEDIFF() restituisce un numero intero con segno (int )
  • DATEDIFF_BIG() restituisce un intero grande con segno (bigint )

In alcuni casi non avrai molto bisogno di restituire un bigint tipo di dati. Questo rappresenta un numero molto grande e se usi DATEDIFF() o DATEDIFF_BIG() non farà alcuna differenza (tranne che per i requisiti di archiviazione – int utilizza 4 byte, bigint utilizza 8 byte).

Tuttavia, 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.

In questo caso dovrai fare una delle tre cose:

  • Utilizza un periodo di tempo più breve. Ad esempio, invece di provare a restituire il numero di millisecondi in 26 giorni, prova 25.
  • Utilizza un datepart meno preciso . Ad esempio, invece di cercare di restituire il numero di millisecondi, provalo con pochi secondi.
  • Usa il DATEDIFF_BIG() funzione invece.

A volte le prime due opzioni non sono adatte. Se hai bisogno di un arco di tempo di 26 giorni, 25 non lo taglieranno. E se hai bisogno di un timestamp Unix dopo il 2038, incontrerai 2038 problemi se usi DATEDIFF() .

In ogni caso, il DATEDIFF_BIG() la funzione consente una gamma di risultati molto più ampia rispetto a DATEDIFF() .

Esempio

Ecco due esempi per dimostrare sia le somiglianze che le differenze tra DATEDIFF() e DATEDIFF_BIG() .

Stesso risultato

Ecco un esempio in cui entrambe le funzioni producono lo stesso risultato:

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;

Risultato:

DATEDIFF  DATEDIFF_BIG
--------  ------------
1000      1000        

Come previsto, entrambe le funzioni restituiscono lo stesso risultato. Questo perché il valore di ritorno è sufficientemente piccolo da soddisfare entrambi i bigint e int tipi di dati. Tutto ciò che abbiamo fatto è stato restituire il numero di millisecondi in 1 secondo.

Risultato diverso

Ora, ecco cosa succede se aumentiamo l'intervallo di tempo a 1000 anni.

Innanzitutto, ecco cosa succede quando utilizziamo DATEDIFF() :

DECLARE @date1 datetime2 = SYSDATETIME();
DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;

Risultato:

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.

Ora, ecco come DATEDIFF_BIG() lo gestisce:

DECLARE @date1 datetime2 = SYSDATETIME();
DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;

Risultato:

DATEDIFF_BIG  
--------------
31556908800000

Restituire il numero di millisecondi in 1000 anni era troppo per un int , ma non è un problema per un bigint .