Freigeben über


DATEDIFF (Transact-SQL)

Gibt die Anzahl (ganze Zahl mit Vorzeichen) der angegebenen datepart-Begrenzungen zurück, die zwischen den angegebenen Werten für startdate und enddate überschritten wurden.

Eine Übersicht über alle Datums- und Uhrzeitdatentypen und die zugehörigen Funktionen von Transact-SQL finden Sie unter Datums- und Uhrzeitdatentypen und zugehörige Funktionen (Transact-SQL).

Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version), Windows Azure SQL-Datenbank (Ursprüngliche Version bis aktuelle Version).

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

DATEDIFF ( datepart , startdate , enddate )

Argumente

  • datepart
    Der Teil von startdate und enddate, der den Typ der überschrittenen Begrenzung angibt. In der folgenden Tabelle sind alle gültigen datepart-Argumente aufgeführt. Benutzerdefinierte Variablenentsprechungen sind nicht gültig.

    datepart

    Abkürzungen

    year

    yy, yyyy

    quarter

    qq, q

    month

    mm, m

    dayofyear

    dy, y

    day

    dd, d

    week

    wk, ww

    hour

    hh

    minute

    mi, n

    second

    ss, s

    millisecond

    ms

    microsecond

    mcs

    nanosecond

    ns

  • startdate
    Ein Ausdruck, der in einen time-Wert, date-Wert, smalldatetime-Wert, datetime-Wert, datetime2-Wert oder datetimeoffset-Wert aufgelöst werden kann. date kann ein Ausdruck, ein Spaltenausdruck, eine benutzerdefinierte Variable oder ein Zeichenfolgenliteral sein. startdate wird von enddate subtrahiert.

    Um Mehrdeutigkeit zu vermeiden, sollten Sie vierstellige Jahreszahlen verwenden. Informationen zu zweistelligen Jahreszahlen finden Sie unter Konfigurieren der Serverkonfigurationsoption Umstellungsjahr für Angaben mit zwei Ziffern.

  • enddate
    Informationen dazu finden Sie unter startdate.

Rückgabetyp

int

Rückgabewert

  • Jedes datepart-Argument und die zugehörigen Abkürzungen geben denselben Wert zurück.

Wenn der Rückgabewert außerhalb des Bereichs für int (-2,147,483,648 bis +2,147,483,647) liegt, wird ein Fehler zurückgegeben. Für millisecond beträgt der maximale Unterschied zwischen startdate und enddate 24 Tage, 20 Stunden, 31 Minuten und 23,647 Sekunden. Für second beträgt der maximale Unterschied 68 Jahre.

Wenn sowohl startdate als auch enddate nur ein Uhrzeitwert zugeordnet ist und es sich bei datepart nicht um eine datepart-Uhrzeit handelt, wird 0 zurückgegeben.

Beim Berechnen des Rückgabewerts wird keine Komponente von startdate oder endate für den Zeitzonenoffset verwendet.

Da smalldatetime nur auf die Minute genaue Werte zurückgibt, werden bei einem smalldatetime-Wert, der für startdate oder enddate verwendet wird, im Rückgabewert die Sekunden und die Millisekunden immer auf 0 festgelegt.

Wenn zu einer Variablen eines Datumsdatentyps nur ein Uhrzeitwert zugeordnet wird, wird für den Wert des fehlenden Datumsteils der Standardwert festgelegt: 1900-01-01. Wenn zu einer Variablen eines Uhrzeit- oder Datumsdatentyps nur ein Datumswert zugeordnet wird, wird für den Wert des fehlenden Uhrzeitteils der Standardwert festgelegt: 00-00-00. Wenn entweder startdate oder enddate nur über einen Uhrzeitteil und der andere nur über einen Datumsteil verfügen, werden für die fehlenden Uhrzeit- und Datumstypen die Standardwerte festgelegt.

Wenn startdate und enddate unterschiedliche Datumsdatentypen darstellen und ein Datentyp mehr Uhrzeitteile oder eine höhere Genauigkeit bezüglich der Bruchteile von Sekunden aufweisen als der andere Teil, wird für die fehlenden Teile des anderen Datentyps 0 festgelegt.

datepart-Begrenzungen

Die folgenden Anweisungen verfügen über denselben Wert für startdate und denselben Wert für endate. Die Datumsangaben folgen aufeinander und unterscheiden sich in der Uhrzeit um 0,0000001 Sekunden. Der Unterschied zwischen startdate und endate in jeder Anweisung überschreitet eine Kalender- oder Uhrzeitbegrenzung des zugehörigen datepart. Jede Anweisung gibt 1 zurück. Wenn für dieses Beispiel unterschiedliche Jahre verwendet werden und sowohl startdate als auch endate in derselben Kalenderwoche liegen, entspricht der Rückgabewert für week dem Wert 0.

SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

Hinweise

DATEDIFF kann in den Klauseln WHERE, HAVING, GROUP BY und ORDER BY der Auswahlliste verwendet werden.

DATEDIFF wandelt Zeichenfolgenliterale implizit als datetime2-Typ um. Daher unterstützt DATEDIFF das Format YDM nicht, wenn das Datum als Zeichenfolge übergeben wird. Sie müssen die Zeichenfolge explizit in einen datetime-Typ oder smalldatetime-Typ umwandeln, um das YDM-Format zu verwenden.

Das Angeben von SET DATEFIRST hat keine Auswirkungen auf DATEDIFF. DATEDIFF verwendet immer Sonntag als ersten Wochentag, um zu gewährleisten, dass die Funktion deterministisch ist.

Beispiele

In den folgenden Beispielen werden verschiedene Ausdruckstypen als Argumente für den startdate-Parameter und enddate-Parameter verwendet.

A.Angeben von Spalten für startdate und enddate

Im folgenden Beispiel wird die Anzahl der Tagesbegrenzungen berechnet, die von den Datumsangaben in zwei Spalten in einer Tabelle überschritten wurden.

CREATE TABLE dbo.Duration
    (
    startDate datetime2
    ,endDate datetime2
    );
INSERT INTO dbo.Duration(startDate,endDate)
    VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09');
SELECT DATEDIFF(day,startDate,endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1

B.Angeben von benutzerdefinierten Variablen für startdate und enddate

Im folgenden Beispiel werden benutzerdefinierte Variablen als Argumente für startdate und enddate verwendet.

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722'; 
SELECT DATEDIFF(day, @startdate, @enddate);

C.Angeben von skalaren Systemfunktionen für startdate und enddate

Im folgenden Beispiel werden skalare Systemfunktionen als Argumente für startdate und enddate verwendet.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());

D.Angeben von skalaren Unterabfragen und skalaren Funktionen für startdate und enddate

Im folgenden Beispiel werden skalare Unterabfragen und Skalarfunktionen als Argumente für startdate und enddate verwendet.

USE AdventureWorks2012;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

E.Angeben von Konstanten für startdate und enddate

Im folgenden Beispiel werden Zeichenkonstanten als Argumente für startdate und enddate verwendet.

SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635');

F.Angeben von numerischen Ausdrücken und skalaren Systemfunktionen für enddate

Im folgenden Beispiel werden ein numerischer Ausdruck, (GETDATE ()+ 1), und skalare Systemfunktionen, GETDATE und SYSDATETIME, als Argumente für enddate verwendet.

USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1) 
    AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO

G.Angeben von Rangfolgefunktionen für startdate

Im folgenden Beispiel wird eine Rangfolgefunktion als Argument für startdate verwendet.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
    ,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY 
        a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s 
    INNER JOIN Person.Person p 
        ON s.BusinessEntityID = p.BusinessEntityID
    INNER JOIN Person.Address a 
        ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

H.Angeben einer Aggregatfensterfunktion für startdate

Im folgenden Beispiel wird eine Aggregatfensterfunktion als Argument für startdate verwendet.

USE AdventureWorks2012;
GO
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty,soh.OrderDate
    ,DATEDIFF(day,MIN(soh.OrderDate) 
        OVER(PARTITION BY soh.SalesOrderID),SYSDATETIME() ) AS 'Total'
FROM Sales.SalesOrderDetail sod
    INNER JOIN Sales.SalesOrderHeader soh
        ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN(43659,58918);
GO

Siehe auch

Verweis

CAST und CONVERT (Transact-SQL)