DATEADD (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse 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 )
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 DATEADD
einen 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
, day
und 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
second
und einem Zahlenwert zwischen -30 und +29DATEADD
werden keine Änderungen vorgenommen.Bei einem Datumsteil von
second
und 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 +29998DATEADD
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
DATEADD
ermö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
, , microsecond
oder 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 sehen Sie das Ergebnis.
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 sehen Sie das Ergebnis.
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, 366, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(day, 366, @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 sehen Sie das Ergebnis.
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 sehen Sie das Ergebnis.
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