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
Syntaxis
DATEADD (datepart , number , date )
Argumenten
datepart
Het deel van de datum waaraan DATEADD
een int-getal wordt toegevoegd.
Opmerking
In Azure SQL Database, Azure SQL Managed Instance en SQL Database in Microsoft Fabric kan het getal worden uitgedrukt als een bigint. Deze functie is beschikbaar als preview-versie.
Deze tabel bevat alle geldige datumonderdelenargumenten .
DATEADD
accepteert geen door de gebruiker gedefinieerde variabelenequivalenten voor de datumonderdelenargumenten.
datepart | Afkortingen |
---|---|
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 |
getal
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.
Opmerking
In Azure SQL Database en SQL Database in Microsoft Fabric kan het getal worden uitgedrukt als een bigint. Deze functie is beschikbaar als preview-versie.
datum
Een expressie die kan worden omgezet in een van de volgende waarden:
- datum
- datum en tijd
- datetimeoffset
- datetime2
- smalldatetime
- Tijd
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
, day
en 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.000
deze 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.
Opmerking
In Azure SQL Database en SQL Database in Microsoft Fabric 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,DATEADD
brengt u geen wijzigingen aan.Voor een datumdeel van
second
, en een getalwaarde kleiner dan -30 of meer dan +29,DATEADD
wordt de toevoeging vanaf één minuut uitgevoerd.Voor een datumgedeelte van
millisecond
en een getalwaarde tussen -30001 en +29998 wordenDATEADD
geen wijzigingen aangebracht.Voor een datumdeel van
millisecond
en een getalwaarde kleiner dan -30001, of meer dan +29998,DATEADD
wordt de toevoeging vanaf één minuut uitgevoerd.
Opmerkingen
Gebruik DATEADD
in de volgende componenten:
GROUP BY
HAVING
ORDER BY
SELECT <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 nanosecond
moet 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
, microsecond
of 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.
Voorbeelden
Eén. 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 PromisedShipDate
af 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