DATEDIFF (Transact-SQL)DATEDIFF (Transact-SQL)

GILT FÜR: jaSQL Server (ab 2008) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Diese Funktion 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.This function returns the count (as a signed integer value) of the specified datepart boundaries crossed between the specified startdate and enddate.

Unter DATEDIFF_BIG (Transact-SQL) finden Sie eine Funktion, die größere Unterschiede zwischen den startdate- und enddate-Werten behandelt.See DATEDIFF_BIG (Transact-SQL) for a function that handles larger differences between the startdate and enddate values. Unter Datums- und Uhrzeitdatentypen und zugehörige Funktionen (Transact-SQL) finden Sie eine Übersicht über alle Transact-SQLTransact-SQL Datums- und Uhrzeitdatentypen und zugehörige Funktionen.See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQLTransact-SQL date and time data types and functions.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

DATEDIFF ( datepart , startdate , enddate )  

ArgumenteArguments

datepartdatepart
Der Teil von startdate und enddate, der den Typ der überschrittenen Begrenzung angibt.The part of startdate and enddate that specifies the type of boundary crossed. DATEDIFF akzeptiert keine benutzerdefinierten Variablenentsprechungen.DATEDIFF will not accept user-defined variable equivalents. In der folgenden Tabelle werden alle gültigen datepart-Argumente aufgeführt.This table lists all valid datepart arguments.

datepartdatepart AbkürzungenAbbreviations
yearyear yy, yyyyyy, yyyy
quarterquarter qq, qqq, q
monthmonth mm, mmm, m
dayofyeardayofyear dy, ydy, y
dayday dd, ddd, d
weekweek wk, wwwk, ww
hourhour hhhh
minuteminute mi, nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

startdatestartdate
Ein Ausdruck, der in einen der folgenden Werte aufgelöst werden kann:An expression that can resolve to one of the following values:

  • Datumdate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • Uhrzeittime

Um Mehrdeutigkeiten zu vermeiden, sollten Sie vierstellige Jahreszahlen verwenden.Use four-digit years to avoid ambiguity. Informationen zu zweistelligen Jahreszahlen finden Sie unter Konfigurieren der Serverkonfigurationsoption „Umstellungsjahr für Angaben mit zwei Ziffern“.See Configure the two digit year cutoff Server Configuration Option for information about two-digit year values.

enddateenddate
Weitere Informationen finden Sie unter startdate.See startdate.

RückgabetypReturn Type

intint

RückgabewertReturn Value

Alle spezifischen datepart-Werte und die Abkürzungen für diese datepart-Werte geben den gleichen Wert zurück.Each specific datepart and the abbreviations for that datepart will return the same value.

Bei einem Rückgabewert, der sich außerhalb des gültigen Bereichs für int (-2,147,483,648 bis + 2,147,483,647) befindet, gibt DATEDIFF einen Fehler zurück.For a return value out of range for int (-2,147,483,648 to +2,147,483,647), DATEDIFF returns an error. Der maximale Unterschied zwischen startdate und enddate beträgt für millisecond 24 Tage, 20 Stunden, 31 Minuten und 23,647 Sekunden.For millisecond, the maximum difference between startdate and enddate is 24 days, 20 hours, 31 minutes and 23.647 seconds. Für second beträgt der maximale Unterschied 68 Jahre, 19 Tage, 3 Stunden, 14 Minuten und 7 Sekunden.For second, the maximum difference is 68 years, 19 days, 3 hours, 14 minutes and 7 seconds.

Wenn startdate und enddate jeweils nur ein Uhrzeitwert zugewiesen ist und datepart kein Zeit-datepart ist, gibt DATEDIFF 0 (null) zurück.If startdate and enddate are both assigned only a time value, and the datepart is not a time datepart, DATEDIFF returns 0.

Beim Berechnen des Rückgabewerts verwendet DATEDIFF keine Komponente von startdate oder enddate für den Zeitzonenoffset.DATEDIFF does not use a time zone offset component of startdate or enddate to calculate the return value.

Da smalldatetime nur auf die Minute genaue Werte zurückgibt, werden im Rückgabewert die Sekunden und Millisekunden immer auf 0 (null) festgelegt, wenn startdate oder enddate einen smalldatetime-Wert aufweist.Because smalldatetime is accurate only to the minute, seconds and milliseconds are always set to 0 in the return value when startdate or enddate have a smalldatetime value.

Wenn der Variablen eines Datumsdatentyps nur ein Uhrzeitwert zugewiesen ist, legt DATEDIFF den Wert des fehlenden Datumsteils auf den Standardwert 1900-01-01 fest.If only a time value is assigned to a date data type variable, DATEDIFF sets the value of the missing date part to the default value: 1900-01-01. Wenn der Variablen eines Uhrzeit- oder Datumsdatentyps nur ein Datumswert zugewiesen ist, legt DATEDIFF den Wert des fehlenden Uhrzeitteils auf den Standardwert 00:00:00 fest.If only a date value is assigned to a variable of a time or date data type, DATEDIFF sets the value of the missing time part to the default value: 00:00:00. Wenn entweder startdate oder enddate nur über einen Uhrzeitteil und der andere nur über einen Datumsteil verfügt, legt DATEDIFF für die fehlenden Uhrzeit- und Datumstypen die Standardwerte fest.If either startdate or enddate have only a time part and the other only a date part, DATEDIFF sets the missing time and date parts to the default values.

Wenn startdate und enddate unterschiedliche Datumsdatentypen aufweisen und ein Datentyp mehr Uhrzeitteile oder eine höhere Genauigkeit bezüglich der Bruchteile von Sekunden aufweist als der andere Teil, legt DATEDIFF für die fehlenden Teile des anderen Datentyps 0 (null) fest.If startdate and enddate have different date data types, and one has more time parts or fractional seconds precision than the other, DATEDIFF sets the missing parts of the other to 0.

datepart-Begrenzungendatepart boundaries

Die folgenden Anweisungen weisen bei startdate und enddate den gleichen Wert auf.The following statements have the same startdate and the same enddate values. Die Datumsangaben folgen aufeinander und unterscheiden sich in der Uhrzeit um eine Mikrosekunde (0,0000001 Sekunden).Those dates are adjacent and they differ in time by one microsecond (.0000001 second). Der Unterschied zwischen startdate und enddate in jeder Anweisung überschreitet eine Kalender- oder Uhrzeitbegrenzung des zugehörigen datepart.The difference between the startdate and enddate in each statement crosses one calendar or time boundary of its datepart. Jede Anweisung gibt 1 zurück.Each statement returns 1. Wenn startdate und enddate unterschiedliche Jahreswerte aufweisen, die Kalenderwochenwerte jedoch identisch sind, gibt DATEDIFF für den datepart-Wert week 0 (null) zurück.If startdate and enddate have different year values but they have the same calendar week values, DATEDIFF will return 0 for datepart week.

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');

RemarksRemarks

Verwenden Sie DATEDIFF in den Klauseln SELECT <list>, WHERE, HAVING, GROUP BY und ORDER BY.Use DATEDIFF in the SELECT <list>, WHERE, HAVING, GROUP BY and ORDER BY clauses.

DATEDIFF wandelt Zeichenfolgenliterale implizit in den datetime2-Typ um.DATEDIFF implicitly casts string literals as a datetime2 type. Daher unterstützt DATEDIFF das Format YDM nicht, wenn das Datum als Zeichenfolge übergeben wird.This means that DATEDIFF does not support the format YDM when the date is passed as a string. Sie müssen die Zeichenfolge explizit in den Typ datetime oder smalldatetime umwandeln, um das YDM-Format zu verwenden.You must explicitly cast the string to a datetime or smalldatetime type to use the YDM format.

Das Festlegen von SET DATEFIRST wirkt sich nicht auf DATEDIFF aus.Specifying SET DATEFIRST has no effect on DATEDIFF. DATEDIFF verwendet immer Sonntag als ersten Wochentag, um sicherzustellen, dass die Funktion deterministisch ist.DATEDIFF always uses Sunday as the first day of the week to ensure the function operates in a deterministic way.

DATEDIFF kann mit der Genauigkeit minute oder mehr überlaufen, wenn der Unterschied zwischen enddate und startdate einen Wert zurückgibt, der sich außerhalb des Bereichs von int befindet.DATEDIFF may overflow with a precision of minute or higher if the difference between enddate and startdate returns a value that is out of range for int.

BeispieleExamples

In diesen Beispielen werden verschiedene Typen von Ausdrücken als Argumente für die Parameter startdate und enddate verwendet.These examples use different types of expressions as arguments for the startdate and enddate parameters.

A.A. Angeben von Spalten für startdate und enddateSpecifying columns for startdate and enddate

In diesem Beispiel wird die Anzahl der Tagesbegrenzungen berechnet, die von den Datumsangaben in zwei Spalten in einer Tabelle überschritten wurden.This example calculates the number of day boundaries crossed between dates in two columns in a table.

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.B. Angeben von benutzerdefinierten Variablen für startdate und enddateSpecifying user-defined variables for startdate and enddate

In diesem Beispiel werden benutzerdefinierte Variablen als Argumente für startdate und enddate verwendet.In this example, user-defined variables serve as arguments for startdate and enddate.

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.C. Angeben von skalaren Systemfunktionen für startdate und enddateSpecifying scalar system functions for startdate and enddate

In diesem Beispiel werden skalare Systemfunktionen als Argumente für startdate und enddate verwendet.This example uses scalar system functions as arguments for startdate and enddate.

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

D.D. Angeben von skalaren Unterabfragen und skalaren Funktionen für startdate und enddateSpecifying scalar subqueries and scalar functions for startdate and enddate

In diesem Beispiel werden skalare Unterabfragen und skalare Funktionen als Argumente für startdate und enddate verwendet.This example uses scalar subqueries and scalar functions as arguments for startdate and enddate.

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

E.E. Angeben von Konstanten für startdate und enddateSpecifying constants for startdate and enddate

In diesem Beispiel werden Zeichenkonstanten als Argumente für startdate und enddate verwendet.This example uses character constants as arguments for startdate and enddate.

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

F.F. Angeben von numerischen Ausdrücken und skalaren Systemfunktionen für enddateSpecifying numeric expressions and scalar system functions for enddate

In diesem Beispiel werden ein numerischer Ausdruck, (GETDATE() + 1), und skalare Systemfunktionen, GETDATE und SYSDATETIME, als Argumente für enddate verwendet.This example uses a numeric expression, (GETDATE() + 1), and scalar system functions GETDATE and SYSDATETIME, as arguments for enddate.

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.G. Angeben von Rangfolgefunktionen für startdateSpecifying ranking functions for startdate

In diesem Beispiel wird eine Rangfolgefunktion als Argument für startdate verwendet.This example uses a ranking function as an argument for startdate.

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.H. Angeben einer Aggregatfensterfunktion für startdateSpecifying an aggregate window function for startdate

In diesem Beispiel wird eine Aggregatfensterfunktion als Argument für startdate verwendet.This example uses an aggregate window function as an argument for startdate.

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  

I.I. Ermitteln des Unterschieds zwischen „startdate“ und „enddate“ als Zeichenfolgen für DatumsteileFinding difference between startdate and enddate as date parts strings

DECLARE @date1 DATETIME, @date2 DATETIME, @result VARCHAR(100)
DECLARE @years INT, @months INT, @days INT, @hours INT, @minutes INT, @seconds INT, @milliseconds INT

SET @date1 = '1900-01-01 00:00:00.000'
SET @date2 = '2018-12-12 07:08:01.123'

SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1 
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)

SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1 
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)

SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1 
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)

SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1 
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)

SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1 
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)

SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1 
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)

SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)

SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')    
     + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
     + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
     + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) 
          + CASE WHEN @milliseconds > 0 THEN '.' + CAST(@milliseconds AS VARCHAR(10)) 
               ELSE '' END 
          + ' seconds','')

SELECT @result

Im Folgenden finden Sie das Resultset.Here is the result set.

118 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse.Examples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

In diesen Beispielen werden verschiedene Typen von Ausdrücken als Argumente für die Parameter startdate und enddate verwendet.These examples use different types of expressions as arguments for the startdate and enddate parameters.

J.J. Angeben von Spalten für startdate und enddateSpecifying columns for startdate and enddate

In diesem Beispiel wird die Anzahl der Tagesbegrenzungen berechnet, die von den Datumsangaben in zwei Spalten in einer Tabelle überschritten wurden.This example calculates the number of day boundaries crossed between dates in two columns in a table.

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 TOP(1) DATEDIFF(day, startDate, endDate) AS Duration  
    FROM dbo.Duration;  
-- Returns: 1  

K.K. Angeben von skalaren Unterabfragen und skalaren Funktionen für startdate und enddateSpecifying scalar subqueries and scalar functions for startdate and enddate

In diesem Beispiel werden skalare Unterabfragen und skalare Funktionen als Argumente für startdate und enddate verwendet.This example uses scalar subqueries and scalar functions as arguments for startdate and enddate.

-- Uses AdventureWorks  
  
SELECT TOP(1) DATEDIFF(day, (SELECT MIN(HireDate) FROM dbo.DimEmployee),  
    (SELECT MAX(HireDate) FROM dbo.DimEmployee))   
FROM dbo.DimEmployee;  
  

L.L. Angeben von Konstanten für startdate und enddateSpecifying constants for startdate and enddate

In diesem Beispiel werden Zeichenkonstanten als Argumente für startdate und enddate verwendet.This example uses character constants as arguments for startdate and enddate.

-- Uses AdventureWorks  
  
SELECT TOP(1) DATEDIFF(day,
    '2007-05-07 09:53:01.0376635',
    '2007-05-08 09:53:01.0376635') FROM DimCustomer;  

M.M. Angeben von Rangfolgefunktionen für startdateSpecifying ranking functions for startdate

In diesem Beispiel wird eine Rangfolgefunktion als Argument für startdate verwendet.This example uses a ranking function as an argument for startdate.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName,
    DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY   
        DepartmentName), SYSDATETIME()) AS RowNumber  
FROM dbo.DimEmployee;  

N.N. Angeben einer Aggregatfensterfunktion für startdateSpecifying an aggregate window function for startdate

In diesem Beispiel wird eine Aggregatfensterfunktion als Argument für startdate verwendet.This example uses an aggregate window function as an argument for startdate.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName, DepartmentName,
    DATEDIFF(year, MAX(HireDate)  
        OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue  
FROM dbo.DimEmployee  

Siehe auchSee also

DATEDIFF_BIG (Transact-SQL)DATEDIFF_BIG (Transact-SQL)
CAST und CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)