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

DATEDIFF()-Beispiele in SQL Server

In SQL Server können Sie T-SQL DATEDIFF() verwenden Funktion, um die Differenz zwischen zwei Daten/Zeiten zurückzugeben. Es funktioniert mit jedem Ausdruck, der in eine Zeit aufgelöst werden kann , Datumsmalldatetimedatetimedatetime2 , oder datetimeoffset Wert.

Dieser Artikel enthält Beispiele für DATEDIFF() Funktion in SQL Server.

Syntax

Hier ist zunächst die Syntax:

DATEDIFF ( datepart , startdate , enddate )

Wo datepart ist der Teil des Datums, den Sie vergleichen möchten. Startdatum ist das erste Datum und Enddatum ist das Enddatum.

Es funktioniert so, dass es die Anzahl (als vorzeichenbehafteter ganzzahliger Wert) des angegebenen datepart zurückgibt Grenzen, die zwischen dem angegebenen Startdatum überschritten wurden und Enddatum .

Beispiel 1

Hier ist ein einfaches Beispiel, bei dem wir die Anzahl der Tage zwischen zwei Daten herausfinden:

SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

Ergebnis:

+----------+
| Result   |
|----------|
| 365      |
+----------+

Beispiel 2

Hier ist ein weiteres Beispiel, in dem ich zwei Variablen deklariere und ihnen zwei verschiedene Daten zuweise (ich verwende DATEADD() um 1 Jahr zum ersten Datum hinzuzufügen). Ich verwende dann DATEDIFF() um verschiedene Datumsteile für dieses Datum zurückzugeben:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
SELECT 
    DATEDIFF( year, @date1, @date2 ) AS Years,
    DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
    DATEDIFF( month, @date1, @date2 ) AS Months,
    DATEDIFF( week, @date1, @date2 ) AS Weeks,
    DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
    DATEDIFF( day, @date1, @date2 ) AS Days;

Ergebnis:

+---------+------------+----------+---------+-------------+--------+
| Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
|---------+------------+----------+---------+-------------+--------|
| 1       | 4          | 12       | 53      | 366         | 366    |
+---------+------------+----------+---------+-------------+--------+

Beispiel 3

Wie erwähnt, können Sie auch die Zeitteile zwischen den Daten zurückgeben. Hier ist ein Beispiel für die Rückgabe der Anzahl von Stunden, Minuten und Sekunden zwischen den Datums-/Uhrzeitwerten:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
SELECT 
    DATEDIFF( hour, @date1, @date2 ) AS Hours,
    DATEDIFF( minute, @date1, @date2 ) AS Minutes,
    DATEDIFF( second, @date1, @date2 ) AS Seconds;

Ergebnis:

+---------+-----------+-----------+
| Hours   | Minutes   | Seconds   |
|---------+-----------+-----------|
| 1       | 60        | 3600      |
+---------+-----------+-----------+

Beispiel 4

Und hier ist ein Beispiel für das Abrufen der Anzahl von Millisekunden, Mikrosekunden und Nanosekunden zwischen zwei Datums-/Uhrzeitwerten:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Ergebnis:

+----------------+----------------+---------------+
| Milliseconds   | Microseconds   | Nanoseconds   |
|----------------+----------------+---------------|
| 1              | 1000           | 1000000       |
+----------------+----------------+---------------+

Beispiel 5 – Fehler!

Wenn Sie versuchen, etwas Extremes zu tun, z. B. die Anzahl der Nanosekunden in 100 Jahren zurückzugeben, erhalten Sie eine Fehlermeldung. Das liegt daran, dass DATEDIFF() gibt ein int zurück Wert, und es gibt mehr Nanosekunden in 100 Jahren als int Datentyp verarbeiten kann.

Folgendes passiert also, wenn Sie das versuchen:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Ergebnis:

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. 

Wenn Sie wirklich herausfinden müssen, wie viele Nanosekunden in 100 Jahren sind, können Sie zum Glück DATEDIFF_BIG() verwenden funktionieren stattdessen. Diese Funktion gibt ein signiertes bigint zurück Datentyp, mit dem Sie viel größere Werte als DATEDIFF() zurückgeben können kann.

Beispiel 6 – Komische Ergebnisse erhalten?

Die Ergebnisse erhalten Sie von DATEDIFF() kann manchmal völlig falsch aussehen, wenn Sie nicht wissen, wie die Funktion tatsächlich funktioniert.

Zum Beispiel:

DECLARE 
  @startdate datetime2 = '2016-01-01  00:00:00.0000000', 
  @enddate datetime2 = '2016-12-31 23:59:59.9999999';
SELECT 
  DATEDIFF(day, @startdate, @enddate) Days,
  DATEDIFF(year, @startdate, @enddate) Years;

Ergebnis:

+--------+---------+
| Days   | Years   |
|--------+---------|
| 365    | 0       |
+--------+---------+

Wenn Sie nicht wissen, wie DATEDIFF() tatsächlich funktioniert, könnte dieses Ergebnis so falsch aussehen, dass Sie davon ausgehen könnten, dass es sich um einen Fehler handelt. Aber es ist kein Fehler.

Überprüfen Sie, ob DATEDIFF() in SQL Server falsche Ergebnisse zurückgibt? Lesen Sie dies. um dieses Beispiel und andere Fälle zu sehen, in denen die Ergebnisse völlig falsch aussehen können, aber vollkommen korrekt sind (und um zu erklären, warum sie so aussehen, wie sie aussehen).

Eines der Beispiele auf dieser Seite ist hier wahrscheinlich noch einmal erwähnenswert. DATEDIFF() ignoriert tatsächlich Ihr SET DATEFIRST Wert. Dies kann zu unerwarteten Ergebnissen führen, insbesondere wenn Sie in einer Kultur leben, die den Sonntag nicht als ersten Tag der Woche verwendet. Sehen Sie sich diese Problemumgehung für DATEDIFF() Ignorieren von SET DATEFIRST in SQL Server an, wenn Sie glauben, dass dies Sie betreffen könnte.