Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Warehouse in Microsoft Fabric
Deze functie voegt een getal (een ondertekend geheel getal) toe aan een datumdeel van een invoerdatum en retourneert een gewijzigde datum/tijd-waarde. U kunt deze functie bijvoorbeeld gebruiken om de datum te vinden die 7.000 minuten van vandaag is: getal = 7000, datumdeel = minuut, datum = vandaag.
Zie datum- en tijdgegevenstypen en -functies voor een overzicht van alle Transact-SQL datum- en tijdgegevenstypen en -functies.
Transact-SQL syntaxis-conventies
Syntax
DATEADD (datepart , number , date )
Arguments
datepart
Het deel van de datum waaraan DATEADD een int-getal wordt toegevoegd.
Deze tabel bevat alle geldige datumonderdelenargumenten .
DATEADDaccepteert geen door de gebruiker gedefinieerde variabelenequivalenten voor de datumonderdelenargumenten.
| 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
Een expressie die kan worden omgezet in een int die DATEADD wordt toegevoegd aan een datumgedeelte van de datum.
DATEADD accepteert door de gebruiker gedefinieerde variabelewaarden voor getal.
DATEADD Kapt een opgegeven getalwaarde af met een decimaalteken. In deze situatie wordt de getalwaarde niet afgerond.
Note
In SQL Server 2025 (17.x) Preview, Azure SQL Database, Azure SQL Managed Instance en SQL Database in Microsoft Fabric Preview kan het getal worden uitgedrukt als een bigint. Deze functie is beschikbaar als preview-versie.
date
Een expressie die kan worden omgezet in een van de volgende waarden:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Voor datumDATEADD accepteert u een kolomexpressie, expressie, letterlijke tekenreeks of door de gebruiker gedefinieerde variabele. Een letterlijke tekenreekswaarde moet worden omgezet in een datum/tijd. Gebruik viercijferige jaren om dubbelzinnigheidsproblemen te voorkomen. Zie Serverconfiguratie: cutoff van twee cijfers voor informatie over tweecijferige jaren.
Retourtypen
Het gegevenstype retourwaarde voor deze methode is dynamisch. Het retourtype is afhankelijk van het argument dat is opgegeven voor date. Als de waarde voor date een letterlijke tekenreeksdatum is, DATEADD wordt een datum/tijd-waarde geretourneerd. Als er een ander geldig invoergegevenstype wordt opgegeven date, DATEADD wordt hetzelfde gegevenstype geretourneerd.
DATEADD veroorzaakt een fout als de schaal voor letterlijke seconden voor tekenreeks groter is dan drie decimale posities (.nnn) of als de letterlijke tekenreeks het verschuivingsgedeelte van de tijdzone bevat.
Retourwaarde
datumdeelargument
dayofyear, dayen weekday retourneert dezelfde waarde.
Elk datumdeel en de bijbehorende afkortingen geven dezelfde waarde als resultaat.
Als het volgende waar is:
-
datepart is
month - de datummaand meer dagen heeft dan de retourmaand
- de datumdag niet bestaat in de retourmaand
DATEADD Retourneert vervolgens de laatste dag van de retourmaand. September heeft bijvoorbeeld 30 (dertig) dagen; daarom retourneren 2024-09-30 00:00:00.000deze instructies:
SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');
getalargument
Het getalargument kan het bereik van int niet overschrijden. In de volgende instructies overschrijdt het argument voor getal het bereik van int door 1.
SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');
Deze instructies retourneren beide het volgende foutbericht:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
Note
In SQL Server 2025 (17.x) Preview, Azure SQL Database, Azure SQL Managed Instance en SQL Database in Microsoft Fabric Preview kan het getal worden uitgedrukt als een bigint. Deze functie is beschikbaar als preview-versie.
datumargument
DATEADD accepteert geen datumargument dat wordt verhoogd naar een waarde buiten het gegevensbereik van het gegevenstype. In de volgende instructies overschrijdt de getalwaarde die is toegevoegd aan de datumwaarde het bereik van het gegevenstype datum .
SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');
DATEADD retourneert het volgende foutbericht:
Msg 517, Level 16, State 1
Line 1 Adding a value to a 'datetime' column caused overflow.
Retourwaarden voor een datumnotatie van smalldatetime en een tweede of fractionele seconden datumdeel
Het secondengedeelte van een smalldatetime-waarde is altijd 00. Voor een datumwaarde voor smalldatetime is het volgende van toepassing:
Voor een datumgedeelte van
second, en een getalwaarde tussen -30 en +29,DATEADDbrengt u geen wijzigingen aan.Voor een datumdeel van
second, en een getalwaarde kleiner dan -30 of meer dan +29,DATEADDwordt de toevoeging vanaf één minuut uitgevoerd.Voor een datumgedeelte van
milliseconden een getalwaarde tussen -30001 en +29998 wordenDATEADDgeen wijzigingen aangebracht.Voor een datumdeel van
milliseconden een getalwaarde kleiner dan -30001, of meer dan +29998,DATEADDwordt de toevoeging vanaf één minuut uitgevoerd.
Remarks
Gebruik DATEADD in de volgende componenten:
GROUP BYHAVINGORDER BYSELECT <list>WHERE
Precisie van breuken seconden
DATEADD staat geen toevoeging toe voor een datumgedeelte van microsecond of nanosecond voor datumgegevenstypensmalldatetime, datum en datum/tijd.
Milliseconden hebben een schaal van 3 (.123), microseconden hebben een schaal van 6 (.123456) en nanoseconden hebben een schaal van 9 (.123456789). De gegevenstypen tijd, datetime2 en datetimeoffset hebben een maximale schaal van 7 (.1234567). Voor een datumdeel van nanosecondmoet het getal 100 zijn vóór de fractionele seconden van de datumverhoging . Een getal tussen 1 en 49 rondt af naar 0 en een getal van 50 tot 99 rondt af tot 100.
Met deze instructies wordt een datumgedeelte van millisecond, microsecondof 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 is het resultatenoverzicht.
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
Tijdzoneverschil
DATEADD staat toevoeging voor tijdzone-offset niet toe.
Examples
A. Datumdeel verhogen met een interval van 1
Elk van deze instructies incrementeert het datumgedeelte met een interval van 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 is het resultatenoverzicht.
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. Meer dan één niveau van het datumgedeelte in één instructie verhogen
Elk van deze instructies incrementeert het datumgedeelte met een getal dat groot genoeg is om het volgende hogere datumgedeelte van de datum te verhogen:
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. Expressies gebruiken als argumenten voor de parameters getal en datum
In deze voorbeelden worden verschillende typen expressies gebruikt als argumenten voor de getal- en datumparameters. In de voorbeelden wordt de AdventureWorks-database gebruikt.
Een kolom opgeven als datum
In dit voorbeeld worden (twee) dagen aan elke waarde in de kolom toegevoegd 2 om een nieuwe kolom met de OrderDate naam PromisedShipDateaf te leiden:
SELECT SalesOrderID,
OrderDate,
DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Hier volgt een gedeeltelijke resultatenset:
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
Door de gebruiker gedefinieerde variabelen opgeven als getal en datum
In dit voorbeeld worden door de gebruiker gedefinieerde variabelen opgegeven als argumenten voor getal en datum:
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 is het resultatenoverzicht.
2000-12-31 01:01:01.110
Scalaire systeemfunctie opgeven als datum
In dit voorbeeld wordt de datum opgegeven SYSDATETIME. De exacte waarde die wordt geretourneerd, is afhankelijk van de dag en tijd van de uitvoering van de instructie:
SELECT DATEADD(month, 1, SYSDATETIME());
Hier is het resultatenoverzicht.
2024-04-25 14:29:59.6727944
Scalaire subquery's en scalaire functies opgeven als getal en datum
In dit voorbeeld worden scalaire subquery's gebruikt, MAX(ModifiedDate)als argumenten voor getal en datum.
(SELECT TOP 1 BusinessEntityID FROM Person.Person) fungeert als een kunstmatig argument voor de getalparameter om te laten zien hoe u een getalargument in een lijst met waarden selecteert.
SELECT DATEADD(month,
(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person)
);
Numerieke expressies en scalaire systeemfuncties opgeven als getal en datum
In dit voorbeeld wordt een numerieke expressie (), -(10 / 2) (-), een rekenkundige operator (/) en scalaire systeemfuncties (SYSDATETIME) gebruikt als argumenten voor getal en datum.
SELECT DATEADD(month, -(10 / 2), SYSDATETIME());
Classificatiefuncties opgeven als getal
In dit voorbeeld wordt een classificatiefunctie gebruikt als argument voor getal.
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;
Een statistische vensterfunctie opgeven als getal
In dit voorbeeld wordt een statistische vensterfunctie gebruikt als argument voor getal.
SELECT SalesOrderID,
ProductID,
OrderQty,
DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO