Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

DATEDIFF() vs. DATEDIFF_BIG() in SQL Server:Was ist der Unterschied?

Wenn Sie jemals den Unterschied zwischen zwei Datumsangaben in SQL Server finden mussten, haben Sie vielleicht den DATEDIFF() verwendet Funktion. Diese Funktion gibt die Zeitspanne zwischen zwei Daten mithilfe eines datepart zurück von Ihnen angegeben. Sie könnten es beispielsweise verwenden, um die Anzahl der Tage zwischen Datum 1 und Datum 2 zurückzugeben. Sie können es auch dazu bringen, die Anzahl der Minuten, Sekunden, Monate, Jahre usw. zurückzugeben.

Der DATEDIFF_BIG() Die Funktion funktioniert genauso, aber mit einem feinen Unterschied:ihrem Rückgabedatentyp.

Der Unterschied zwischen diesen beiden Funktionen ist also der Datentyp ihres Rückgabewerts.

  • DATEDIFF() gibt eine vorzeichenbehaftete Ganzzahl zurück (int )
  • DATEDIFF_BIG() gibt eine vorzeichenbehaftete große Ganzzahl zurück (bigint )

In einigen Fällen müssen Sie nicht viel bigint zurückgeben Datentyp. Dies stellt eine sehr große Zahl dar, und ob Sie DATEDIFF() verwenden oder DATEDIFF_BIG() wird keinen Unterschied machen (außer Speicheranforderungen – int verwendet 4 Bytes, bigint verwendet 8 Bytes).

Wenn Sie jedoch auf den folgenden Fehler stoßen:

Die Funktion datediff führte zu einem Überlauf. Die Anzahl der Datumsteile, die zwei Datums-/Uhrzeitinstanzen trennen, ist zu groß. Versuchen Sie, datediff mit einem weniger genauen Datumsteil zu verwenden.

Das liegt daran, dass der Rückgabewert zu groß ist.

In diesem Fall müssen Sie eines von drei Dingen tun:

  • Verwenden Sie einen kürzeren Zeitraum. Anstatt beispielsweise zu versuchen, die Anzahl der Millisekunden in 26 Tagen zurückzugeben, versuchen Sie es mit 25.
  • Verwenden Sie einen weniger genauen Datumsteil . Anstatt beispielsweise zu versuchen, die Anzahl der Millisekunden zurückzugeben, versuchen Sie es mit nur Sekunden.
  • Verwenden Sie den DATEDIFF_BIG() funktionieren stattdessen.

Manchmal sind die ersten beiden Optionen nicht geeignet. Wenn Sie eine Zeitspanne von 26 Tagen benötigen, reichen 25 nicht aus. Und wenn Sie einen Unix-Zeitstempel nach 2038 benötigen, werden Sie auf 2038-Probleme stoßen, wenn Sie DATEDIFF() verwenden .

In jedem Fall das DATEDIFF_BIG() -Funktion ermöglicht einen viel größeren Ergebnisbereich als DATEDIFF() .

Beispiel

Hier sind zwei Beispiele, um sowohl die Ähnlichkeiten als auch die Unterschiede zwischen DATEDIFF() zu demonstrieren und DATEDIFF_BIG() .

Gleiches Ergebnis

Hier ist ein Beispiel, bei dem beide Funktionen dasselbe Ergebnis liefern:

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;

Ergebnis:

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

Wie erwartet liefern beide Funktionen das gleiche Ergebnis. Dies liegt daran, dass der Rückgabewert klein genug ist, um sowohl bigint zu berücksichtigen und int Datentypen. Alles, was wir getan haben, war die Anzahl der Millisekunden in 1 Sekunde zurückzugeben.

Unterschiedliches Ergebnis

Nun, hier ist, was passiert, wenn wir den Zeitrahmen auf 1000 Jahre erhöhen.

Zunächst einmal passiert Folgendes, wenn wir DATEDIFF() verwenden :

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

Ergebnis:

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.

Nun, hier ist, wie DATEDIFF_BIG() handhabt es:

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

Ergebnis:

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

Die Anzahl der Millisekunden in 1000 Jahren zurückzugeben, war zu viel für einen int , aber für einen bigint ist das kein Problem .