DATEADD (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric

Diese Funktion fügt einen angegebenen number-Wert (eine ganze Zahl mit Vorzeichen) zu einem datepart-Wert eines eingegebenen date-Werts hinzu und gibt diesen geänderten Wert anschließend zurück. Beispielsweise können Sie diese Funktion verwenden, um das Datum zu finden, das 7.000 Minuten von heute ist: Zahl = 7000, Datepart = Minute, Datum = heute.

Eine Übersicht über alle Transact-SQL-Datums- und Uhrzeitdatentypen und -funktionen finden Sie unter Datums- und Uhrzeitdatentypen und -funktionen .

Transact-SQL-Syntaxkonventionen

Syntax

DATEADD (datepart , number , date )

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

datepart

Der Teil des Datums, zu dem DATEADD eine Int-Zahl addiert wird. In der folgenden Tabelle werden alle gültigen datepart-Argumente aufgeführt.

Hinweis

DATEADD akzeptiert für die datepart-Argumente keine benutzerdefinierten Variablenentsprechungen.

datepart Abkürzungen
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw, w
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns

Zahl

Ein Ausdruck, der in einen int-Wert aufgelöst werden kann, den DATEADD zu einem datepart-Argument von date hinzufügt. DATEADD akzeptiert für number benutzerdefinierte Variablenwerte. DATEADD schneidet einen angegebenen number-Wert ab, wenn dieser einen Dezimalbruch aufweist. Der Zahlenwert wird in dieser Situation nicht gerundet.

date

Ein Ausdruck, der in einen der folgenden Werte aufgelöst werden kann:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

Akzeptiert für Datum DATEADDeinen Spaltenausdruck, einen Ausdruck, ein Zeichenfolgenliteral oder eine benutzerdefinierte Variable. Ein Zeichenfolgenliteralwert muss in ein datetime-Argument aufgelöst werden. Um Mehrdeutigkeiten zu vermeiden, sollten Sie vierstellige Jahreszahlen verwenden. Informationen zu zweistelligen Jahren finden Sie unter Konfigurieren der zweistelligen Jahrestrennoption (Serverkonfigurationsoption ).

Rückgabetypen

Der Datentyp des Rückgabewerts für diese Methode ist dynamisch. Der Rückgabetyp hängt von dem Argument ab, das für date angegeben wird. Wenn der Wert für date ein Zeichenfolgenliterale für ein Datum ist, gibt DATEADD einen datetime Wert zurück. Wenn für date ein anderer gültiger Eingabedatentyp angegeben wird, gibt DATEADD denselben Datentyp zurück. 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.

Rückgabewert

datepart-Argument

dayofyear, dayund weekday geben Sie denselben Wert zurück.

Jedes datepart-Argument und die jeweils zugehörigen Abkürzungen geben den gleichen Wert zurück.

Wenn Folgendes zutrifft:

  • datepart ist month
  • Der Monat mit dem Wert date weist mehr Tage auf als der Rückgabemonat
  • Das Datum, an dem der Tag im Rückgabemonat nicht vorhanden ist

Anschließend gibt DATEADD den letzten Tag des Rückgabemonats zurück. Beispielsweise hat September 30 (dreißig) Tage; daher werden diese Anweisungen zurückgegeben 2024-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');

number-Argument

Das Zahlenargument darf den Bereich von int nicht überschreiten. In den folgenden Anweisungen überschreitet das Argument für Zahl den Bereich von int um 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.

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

date-Argument

DATEADD akzeptiert kein Datumsargument , das auf einen Wert außerhalb des Datentyps erhöht wird. In den folgenden Anweisungen überschreitet der number-Wert, der zum date-Wert hinzugefügt wird, den Bereich des Datentyps date. DATEADD gibt die folgende Fehlermeldung zurück: Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.

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

Zurückgeben von Werten für ein Kleindatum und ein zweites oder bruchteilales Sekunden-Datumsteil

Die Sekundenangabe eines smalldatetime-Werts ist immer 00. Für einen smalldatetime-date-Wert gilt Folgendes:

  • Bei einem Datumsteil von secondund einem Zahlenwert zwischen -30 und +29 DATEADD werden keine Änderungen vorgenommen.

  • Bei einem Datumsteil von secondund einem Zahlenwert , der kleiner als -30 oder mehr als +29 ist, DATEADD wird die Addition zu einer Minute ausgeführt.

  • Für einen Datumsteil und millisecond einen Zahlenwert zwischen -30001 und +29998 DATEADD werden keine Änderungen vorgenommen.

  • Bei einem Datumsteil und einem Zahlenwert, der millisecond kleiner als -30001 oder mehr als +29998 ist, DATEADD wird die Addition mit einer Minute ausgeführt.

Hinweise

Verwenden Sie DATEADD in den folgenden Klauseln:

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

Genauigkeit in Millisekunden

DATEADDermöglicht keine Ergänzung für einen Datumsteil von microsecond oder nanosecond für Datumsdatentypen "Smalldatetime", "date" und "datetime".

Millisekunden haben eine Skala von 3 (.123), Mikrosekunden haben eine Skala von 6 (.123456), und Nanosekunden haben eine Skala von 9 (.123456789). Die Datentypen "time", "datetime2" und "datetimeoffset " haben eine maximale Skalierung von 7 (.1234567). Für einen Datumsteil muss die Zahl 100 sein, bevor die Bruch sekunden des Datums erhöht werden.For a datepart of nanosecond, number must be 100 before the fractional seconds of date increase. Eine Zahl zwischen 1 und 49 rundet auf 0 ab, und eine Zahl von 50 bis 99 rundet auf 100 auf.

Diese Anweisungen fügen einen Datumsteil von millisecond, , microsecondoder nanosecond.

DECLARE @datetime2 DATETIME2 = '2024-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);

Hier ist das Resultset.

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

Zeitzonenoffset

DATEADD lässt keine Addition für den Zeitzonenoffset zu.

Beispiele

A. Inkrementieren von datepart mit einem Intervall von 1

Jede dieser Anweisungen inkrementiert datepart mit einem Intervall von 1:

DECLARE @datetime2 DATETIME2 = '2024-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);

Hier ist das Resultset.

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

B. Inkrementieren mehrerer Ebenen von datepart in einer Anweisung

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:

DECLARE @datetime2 DATETIME2;

SET @datetime2 = '2024-01-01 01:01:01.1111111';

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

C. Verwenden von Ausdrücken als Argumente für den number-Parameter und den date-Parameter

In diesen Beispielen werden verschiedene Typen von Ausdrücken als Argumente für die Parameter number und date verwendet. In den Beispielen wird die Datenbank „AdventureWorks“ verwendet.

Angeben einer Spalte als date-Parameter

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:

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

Hier ist ein partielles Resultset:

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 date

In diesem Beispiel werden benutzerdefinierte Variablen als Argumente für number und date angegeben:

DECLARE @days INT = 365,
    @datetime DATETIME = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;

SELECT DATEADD(day, @days, @datetime);

Hier ist das Resultset.

2000-12-31 01:01:01.110

Angeben einer skalaren Systemfunktion als Argument für date

In diesem Beispiel wird SYSDATETIME für date angegeben. Welcher Wert genau zurückgegeben wird, hängt davon ab, an welchem Tag und zu welcher Uhrzeit die Anweisung ausgeführt wird:

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

Hier ist das Resultset.

2024-04-25 14:29:59.6727944

Angeben von skalaren Unterabfragen und skalaren Funktionen als Argumente für number und date

In diesem Beispiel werden skalare Unterabfragen (MAX(ModifiedDate)) als Argumente für number und date verwendet. (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 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 date

In diesem Beispiel wird ein numerischer Ausdruck (-(10 / 2)), unäre Operatoren (-), ein arithmetischer Operator (/) und skalare Systemfunktionen (SYSDATETIME) als Argumente für Zahl und Datum verwendet.

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

Angeben von Rangfolgefunktionen als Argumente für number

In diesem Beispiel wird eine Rangfolgefunktion als Argument für number verwendet.

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 number

In diesem Beispiel wird eine Aggregatfensterfunktion als Argument für number verwendet.

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