Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-Analyseendpunkt in Microsoft Fabric
Lagerhaus in Microsoft Fabric
SQL-Datenbank 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.
Diese Funktion fügt eine Zahl (ein signiertes Biglitt) zu einem Datumsteil eines Eingabedatums hinzu und liefert einen modifizierten Datums-/Zeitwert. 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 )
Arguments
datepart
Der Teil des Datums, zu dem DATEADD eine Int-Zahladdiert wird.
Der Teil des Datums, zu dem DATEADD eine Bigott-Zahl hinzugefügt wird.
In der folgenden Tabelle werden alle gültigen datepart-Argumente aufgeführt.
DATEADD akzeptiert für die datepart-Argumente keine benutzerdefinierten Variablenentsprechungen.
| datepart | Abbreviations |
|---|---|
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 |
number
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.
Ein Ausdruck, der sich zu einem Biglint auflösen kann, der DATEADD zu einem Date-Teil des Dates 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 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. Siehe Serverkonfiguration: zweistellige Jahreskürzung für Informationen zu zweistelligen Jahren.
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 Skalierung der Zeichenfolgenliteral sekunden drei Dezimalstellen (.nnn) überschreitet oder wenn das Zeichenfolgenliteral den Zeitzonenoffsetteil 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');
Zahlenargument
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.
SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');
Diese Anweisungen geben beide die folgende Fehlermeldung zurück:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
Das Zahlenargument kann den Bereich von Bigynt nicht überschreiten. In den folgenden Aussagen überschreitet das Argument für die Zahl den Bereich der Bisine um 1.
DECLARE @datetime2 AS DATETIME2;
SET @datetime2 = '2025-11-01 01:01:01.1111111';
SELECT DATEADD(nanosecond, 9223372036854775808, @datetime2);
SELECT DATEADD(nanosecond, -9223372036854775809, @datetime2);
GO
Diese Anweisungen geben beide die folgende Fehlermeldung zurück:
Msg 8115, Level 16, State 2, Line 3
Arithmetic overflow error converting expression to data type bigint.
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.
SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');
DATEADD gibt die folgende Fehlermeldung zurück:
Msg 517, Level 16, State 1
Line 1 Adding a value to a 'datetime' column caused overflow.
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 +29DATEADDwerden keine Änderungen vorgenommen.Bei einem Datumsteil von
secondund einem Zahlenwert , der kleiner als -30 oder mehr als +29 ist,DATEADDwird die Addition zu einer Minute ausgeführt.Für einen Datumsteil und
millisecondeinen Zahlenwert zwischen -30001 und +29998DATEADDwerden keine Änderungen vorgenommen.Bei einem Datumsteil und einem
millisecond, der kleiner als -30001 oder mehr als +29998 ist,DATEADDwird die Addition mit einer Minute ausgeführt.
Remarks
Verwenden Sie DATEADD in den folgenden Klauseln:
GROUP BYHAVINGORDER BYSELECT <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 AS 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.
Examples
A. Inkrementieren von datepart mit einem Intervall von 1
Jede dieser Anweisungen inkrementiert datepart mit einem Intervall von 1:
DECLARE @datetime2 AS 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 von mehr als einer Ebene 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 AS 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 2 der Wert OrderDate (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 AS INT = 365,
@datetime AS 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