DATEADD (Transact-SQL)DATEADD (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 fügt einen angegebenen number-Wert (als ganze Zahl mit Vorzeichen) zu einem angegebenen datepart-Wert eines eingegebenen date-Werts hinzu und gibt diesen geänderten Wert anschließend zurück.This function adds a specified number value (as a signed integer) to a specified datepart of an input date value, and then returns that modified value.

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

DATEADD (datepart , number , date )  

ArgumenteArguments

datepartdatepart
Der Teil des date-Werts, zu dem DATEADD einen ganzzahligen number-Wert hinzufügt.The part of date to which DATEADD adds an integer number. In der folgenden Tabelle werden alle gültigen datepart-Argumente aufgeführt.This table lists all valid datepart arguments.

Hinweis

DATEADD akzeptiert keine benutzerdefinierten Variablenentsprechungen für die datepart-Argumente.DATEADD does not accept user-defined variable equivalents for the 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
weekdayweekday dw, wdw, w
hourhour hhhh
minuteminute mi, nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

numbernumber
Ein Ausdruck, der in einen int-Wert aufgelöst werden kann, den DATEADD zu einem datepart-Argument von date hinzufügt.An expression that can resolve to an int that DATEADD adds to a datepart of date. DATEADD akzeptiert für number benutzerdefinierte Variablenwerte.DATEADD accepts user-defined variable values for number. DATEADD schneidet einen angegebenen number-Wert ab, wenn dieser einen Dezimalbruch aufweist.DATEADD will truncate a specified number value that has a decimal fraction. In diesem Fall wird der number-Wert nicht gerundet.It will not round the number value in this situation.

Datumdate
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

Bei date akzeptiert DATEADD einen Spaltenausdruck, einen Ausdruck, ein Zeichenfolgenliteral oder eine benutzerdefinierte Variable.For date, DATEADD will accept a column expression, expression, string literal, or user-defined variable. Ein Zeichenfolgenliteralwert muss in ein datetime-Argument aufgelöst werden.A string literal value must resolve to a datetime. Um Mehrdeutigkeiten zu vermeiden, sollten Sie vierstellige Jahreszahlen verwenden.Use four-digit years to avoid ambiguity issues. Unter Konfigurieren der Serverkonfigurationsoption „Umstellungsjahr für Angaben mit zwei Ziffern“ finden Sie weitere Informationen zu zweistelligen Jahreszahlen.See Configure the two digit year cutoff Server Configuration Option for information about two-digit years.

RückgabetypenReturn types

Der Datentyp des date-Arguments wird zum Datentyp des Rückgabewerts DATEADD, mit Ausnahme der date-Werte des Zeichenfolgenliterals.The date argument data type becomes the DATEADD return value data type, except for string literal date values. Bei einem Zeichenfolgenliteral gibt DATEADD einen datetime-Wert zurück.For a string literal, DATEADD returns a datetime value. DATEADD löst einen Fehler aus, wenn die Staffelung des Zeichenfolgenliterals in Sekunden mehr als drei Dezimalstellen (,nnn) umfasst oder wenn das Zeichenfolgenliteral den Teil des Zeitzonenoffsets enthält.DATEADD will raise an error if the string literal seconds scale exceeds three decimal place positions (.nnn) or if the string literal contains the time zone offset part.

RückgabewertReturn Value

datepart-Argumentdatepart Argument

dayofyear, day und weekday geben den gleichen Wert zurück.dayofyear, day, and weekday return the same value.

Jedes datepart-Argument und die zugehörigen Abkürzungen geben den gleichen Wert zurück.Each datepart and its abbreviations return the same value.

Wenn Folgendes zutrifft:If the following are true:

  • Für das datepart-Argument ist month festgelegtdatepart is month
  • Der Monat mit dem Wert date weist mehr Tage auf als der Rückgabemonatthe date month has more days than the return month
  • Der Tag date ist im Rückgabemonat nicht vorhandenthe date day does not exist in the return month

Anschließend gibt DATEADD den letzten Tag des Rückgabemonats zurück.Then, DATEADD returns the last day of the return month. Beispiel: Der September hat 30 (dreißig) Tage. Daher geben die beiden Anweisungen 2006-09-30 00:00:00.000 zurück:For example, September has 30 (thirty) days; therefore, these statements return 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '20060831');

number-Argumentnumber Argument

Das number-Argument kann den Bereich von int nicht überschreiten. In den folgenden Anweisungen überschreitet das Argument für number den Bereich von int um 1.The number argument cannot exceed the range of int. In the following statements, the argument for number exceeds the range of int by 1. Diese Anweisungen geben folgende Fehlermeldung zurück: „Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."These statements both return the following error message: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

SELECT DATEADD(year,2147483648, '20060731');  
SELECT DATEADD(year,-2147483649, '20060731');  

date-Argumentdate Argument

DATEADD akzeptiert kein date-Argument, das in einen Wert außerhalb des Bereichs der zugehörigen Daten inkrementiert wird.DATEADD will not accept a date argument incremented to a value outside the range of its data type. In den folgenden Anweisungen überschreitet der number-Wert, der zum date-Wert hinzugefügt wird, den Bereich des Datentyps date.In the following statements, the number value added to the date value exceeds the range of the date data type. DATEADD gibt die folgende Fehlermeldung zurück: „Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.“DATEADD returns the following error message: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."

SELECT DATEADD(year,2147483647, '20060731');  
SELECT DATEADD(year,-2147483647, '20060731');  

Rückgabewerte für ein Datum vom Typ smalldatetime und einen datepart-Wert in Sekunden oder SekundenbruchteilenReturn Values for a smalldatetime date and a second or Fractional Seconds datepart

Die Sekundenangabe eines smalldatetime-Werts ist immer 00.The seconds part of a smalldatetime value is always 00. Bei dem smalldatetime-Wert date gilt Folgendes:For a smalldatetime date value, the following apply:

  • Bei dem datepart-Wert second und einem number-Wert zwischen -30 und +29 nimmt DATEADD keine Änderungen vor.For a datepart of second, and a number value between -30 and +29, DATEADD makes no changes.
  • Bei dem datepart-Wert second und einem number-Wert, der niedriger als -30 oder höher als +29 ist, beginnt DATEADD bei einer Minute mit der Hinzufügung.For a datepart of second, and a number value less than -30, or more than +29, DATEADD performs its addition beginning at one minute.
  • Bei dem datepart-Wert millisecond und einem number-Wert zwischen -30001 und +29998 nimmt DATEADD keine Änderungen vor.For a datepart of millisecond and a number value between -30001 and +29998, DATEADD makes no changes.
  • Bei dem datepart-Wert millisecond und einem number-Wert, der niedriger als -30001 oder höher als +29998 ist, beginnt DATEADD bei einer Minute mit der Hinzufügung.For a datepart of millisecond and a number value less than -30001, or more than +29998, DATEADD performs its addition beginning at one minute.

RemarksRemarks

Verwenden Sie DATEADD in den folgenden Klauseln:Use DATEADD in the following clauses:

  • GROUP BYGROUP BY
  • HAVINGHAVING
  • ORDER BYORDER BY
  • SELECT <list>SELECT <list>
  • WHEREWHERE

Genauigkeit in MillisekundenFractional seconds precision

DATEADD lässt die Addition eines datepart-Arguments vom Typ microsecond oder nanosecond mit den Datentypen smalldatetime, date und datetime bei datenicht zu.DATEADD does not allow addition for a datepart of microsecond or nanosecond for date data types smalldatetime, date, and datetime.

Millisekunden besitzen drei Dezimalstellen (,123). Mikrosekunden besitzen sechs Dezimalstellen (,123456) und Nanosekunden besitzen neun Dezimalstellen (,123456789).Milliseconds have a scale of 3 (.123), microseconds have a scale of 6 (.123456), and nanoseconds have a scale of 9 (.123456789). Die Datentypen time, datetime2 und datetimeoffset weisen maximal 7 Dezimalstellen (,1234567) auf.The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). Bei dem nanosecond-Wert datepart muss number vor 100 liegen, bevor die Sekundenbruchteile von date erhöht werden.For a datepart of nanosecond, number must be 100 before the fractional seconds of date increase. Ein number-Wert zwischen 1 und 49 wird auf 0 abgerundet, und ein „number“-Wert zwischen 50 und 99 wird auf bis zu 100 aufgerundet.A number between 1 and 49 will round down to 0, and a number from 50 to 99 rounds up to 100.

Folgende Anweisungen fügen datepart mit einem Wert von millisecond, microsecond oder nanosecond hinzu.These statements add a datepart of millisecond, microsecond, or nanosecond.

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';  
SELECT '1 millisecond', DATEADD(millisecond,1,@datetime2)  
UNION ALL  
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)  
UNION ALL  
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)  
UNION ALL  
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)  
UNION ALL  
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)  
UNION ALL  
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)  
UNION ALL  
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);  

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

1 millisecond     2007-01-01 13:10:10.1121111  
2 milliseconds    2007-01-01 13:10:10.1131111  
1 microsecond     2007-01-01 13:10:10.1111121  
2 microseconds    2007-01-01 13:10:10.1111131  
49 nanoseconds    2007-01-01 13:10:10.1111111  
50 nanoseconds    2007-01-01 13:10:10.1111112  
150 nanoseconds   2007-01-01 13:10:10.1111113  

ZeitzonenoffsetTime zone offset

DATEADD lässt das Hinzufügen für einen Zeitzonenoffset nicht zu.DATEADD does not allow addition for time zone offset.

BeispieleExamples

A.A. Inkrementieren von datepart mit einem Intervall von 1Incrementing datepart by an interval of 1

Jede dieser Anweisungen inkrementiert datepart mit einem Intervall von 1:Each of these statements increments datepart by an interval of 1:

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';  
SELECT 'year', DATEADD(year,1,@datetime2)  
UNION ALL  
SELECT 'quarter',DATEADD(quarter,1,@datetime2)  
UNION ALL  
SELECT 'month',DATEADD(month,1,@datetime2)  
UNION ALL  
SELECT 'dayofyear',DATEADD(dayofyear,1,@datetime2)  
UNION ALL  
SELECT 'day',DATEADD(day,1,@datetime2)  
UNION ALL  
SELECT 'week',DATEADD(week,1,@datetime2)  
UNION ALL  
SELECT 'weekday',DATEADD(weekday,1,@datetime2)  
UNION ALL  
SELECT 'hour',DATEADD(hour,1,@datetime2)  
UNION ALL  
SELECT 'minute',DATEADD(minute,1,@datetime2)  
UNION ALL  
SELECT 'second',DATEADD(second,1,@datetime2)  
UNION ALL  
SELECT 'millisecond',DATEADD(millisecond,1,@datetime2)  
UNION ALL  
SELECT 'microsecond',DATEADD(microsecond,1,@datetime2)  
UNION ALL  
SELECT 'nanosecond',DATEADD(nanosecond,1,@datetime2);  

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

Year         2008-01-01 13:10:10.1111111  
quarter      2007-04-01 13:10:10.1111111  
month        2007-02-01 13:10:10.1111111  
dayofyear    2007-01-02 13:10:10.1111111  
day          2007-01-02 13:10:10.1111111  
week         2007-01-08 13:10:10.1111111  
weekday      2007-01-02 13:10:10.1111111  
hour         2007-01-01 14:10:10.1111111  
minute       2007-01-01 13:11:10.1111111  
second       2007-01-01 13:10:11.1111111  
millisecond  2007-01-01 13:10:10.1121111  
microsecond  2007-01-01 13:10:10.1111121  
nanosecond   2007-01-01 13:10:10.1111111  

B.B. Inkrementieren mehrerer Ebenen von datepart in einer AnweisungIncrementing more than one level of datepart in one statement

Jede dieser Anweisungen inkrementiert datepart um einen number-Wert, der hoch genug ist, um auch den nächsthöheren datepart-Wert von date zu inkrementieren:Each of these statements increments datepart by a number large enough to additionally increment the next higher datepart of date:

DECLARE @datetime2 datetime2;  
SET @datetime2 = '2007-01-01 01:01:01.1111111';  
--Statement                                 Result     
-------------------------------------------------------------------   
SELECT DATEADD(quarter,4,@datetime2);     --2008-01-01 01:01:01.1111111  
SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.1111111  
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.1111111  
SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.1111111  
SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.1111111  
SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.1111111  
SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.1111111  
SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.1111111  
SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.1111111  
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.1121111  

C.C. Verwenden von Ausdrücken als Argumente für den number-Parameter und den date-ParameterUsing expressions as arguments for the number and date parameters

In diesen Beispielen werden verschiedene Typen von Ausdrücken als Argumente für die Parameter number und date verwendet.These examples use different types of expressions as arguments for the number and date parameters. In den Beispielen wird die Datenbank „AdventureWorks“ verwendet.The examples use the AdventureWorks database.

Angeben einer Spalte als date-ParameterSpecifying a column as date

Im folgenden Beispiel wird zu jedem Wert in der Spalte OrderDate der Wert 2 (zwei) hinzugefügt, um eine neue Spalte mit dem Namen PromisedShipDate abzuleiten:This example adds 2 (two) days to each value in the OrderDate column, to derive a new column named PromisedShipDate:

SELECT SalesOrderID  
    ,OrderDate   
    ,DATEADD(day,2,OrderDate) AS PromisedShipDate  
FROM Sales.SalesOrderHeader;  

Im Folgenden finden Sie einen Auszug aus dem Resultset:A partial result set:

SalesOrderID OrderDate               PromisedShipDate  
------------ ----------------------- -----------------------  
43659        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000  
43660        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000  
43661        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000  
...  
43702        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43703        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43704        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43705        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43706        2005-07-03 00:00:00.000 2005-07-05 00:00:00.000  
...  
43711        2005-07-04 00:00:00.000 2005-07-06 00:00:00.000  
43712        2005-07-04 00:00:00.000 2005-07-06 00:00:00.000  
...  
43740        2005-07-11 00:00:00.000 2005-07-13 00:00:00.000  
43741        2005-07-12 00:00:00.000 2005-07-14 00:00:00.000  
  

Angeben von benutzerdefinierten Variablen als Argumente für number und dateSpecifying user-defined variables as number and date

In diesem Beispiel werden benutzerdefinierte Variablen als Argumente für number und date angegeben:This example specifies user-defined variables as arguments for number and date:

DECLARE @days int = 365,   
        @datetime datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;  
SELECT DATEADD(day, @days, @datetime);  

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

-----------------------  
2000-12-31 01:01:01.110  
  
(1 row(s) affected)  

Angeben einer skalaren Systemfunktion als Argument für dateSpecifying scalar system function as date

In diesem Beispiel wird SYSDATETIME für date angegeben.This example specifies SYSDATETIME for date. Welcher Wert genau zurückgegeben wird, hängt davon ab, an welchem Tag und zu welcher Uhrzeit die Anweisung ausgeführt wird:The exact value returned depends on the day and time of statement execution:

SELECT DATEADD(month, 1, SYSDATETIME());  

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

---------------------------  
2013-02-06 14:29:59.6727944  
  
(1 row(s) affected)  

Angeben von skalaren Unterabfragen und skalaren Funktionen als Argumente für number und dateSpecifying scalar subqueries and scalar functions as number and date

In diesem Beispiel werden skalare Unterabfragen (MAX(ModifiedDate)) als Argumente für number und date verwendet.This example uses scalar subqueries, MAX(ModifiedDate), as arguments for number and date. (SELECT TOP 1 BusinessEntityID FROM Person.Person) dient als Beispielargument für den Parameter „number“, das veranschaulicht, wie ein number-Argument aus einer Werteliste ausgewählt wird.(SELECT TOP 1 BusinessEntityID FROM Person.Person) serves as an artificial argument for the number parameter, to show how to select a number argument from a value list.

SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),  
    (SELECT MAX(ModifiedDate) FROM Person.Person));  

Angeben von numerischen Ausdrücken und skalaren Systemfunktionen als Argumente für number und dateSpecifying numeric expressions and scalar system functions as number and date

In diesem Beispiel werden numerische Ausdrücke (–(10/2)), unäre Operatoren (-), ein arithmetischer Operator (/) und skalare Systemfunktionen (SYSDATETIME) als Argumente für number und date verwendet.This example uses a numeric expression (-(10/2)), unary operators (-), an arithmetic operator (/), and scalar system functions (SYSDATETIME) as arguments for number and date.

SELECT DATEADD(month,-(10/2), SYSDATETIME());  

Angeben von Rangfolgefunktionen als Argumente für numberSpecifying ranking functions as number

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

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

Angeben einer Aggregatfensterfunktion als Argument für numberSpecifying an aggregate window function as number

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

SELECT SalesOrderID, ProductID, OrderQty  
    ,DATEADD(day,SUM(OrderQty)   
        OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'  
FROM Sales.SalesOrderDetail   
WHERE SalesOrderID IN(43659,43664);  
GO  

Siehe auchSee also

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