Delen via


DATEADD (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricWarehouse 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 . DATEADDaccepteert 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, 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.

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 worden DATEADD 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 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.

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 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