Megosztás a következőn keresztül:


DATEADD (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics platformrendszer (PDW)SQL-elemzési végpont a Microsoft FabricA Microsoft Fabric Warehouse-ban

Ez a függvény egy számot (aláírt egész számot) ad hozzá egy bemeneti dátumdátumrészéhez, és egy módosított dátum/idő értéket ad vissza. Ezzel a függvénnyel például megkeresheti a mai dátumtól számított 7000 percet: szám = 7000, datepart = perc, dátum = ma.

Az összes Transact-SQL dátum - és időadattípus és -függvény áttekintéséhez tekintse meg a Dátum és idő adattípusokat és függvényeket .

Transact-SQL szintaxis konvenciók

Szemantika

DATEADD (datepart , number , date )

Érvek

datepart

A dátum azon része, amelyhez DATEADDintszámot ad hozzá.

Megjegyzés:

Az Azure SQL Database-ben, az Azure SQL Managed Instance-ben és a Microsoft Fabricben található SQL Database-ben a számbigintként fejezhető ki. Ez a funkció előnézetben van.

Ez a táblázat felsorolja az összes érvényes datepart argumentumot. DATEADD nem fogadja el a felhasználó által definiált változóegyenértékeket a datepart argumentumokhoz.

datepart Rövidítések
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

szám

Olyan kifejezés, amely feloldható egy olyan intre, amely DATEADD hozzáad egy dátumrészhez. DATEADD a felhasználó által megadott változóértékeket fogadja el a számhoz. DATEADD csonkolja a megadott számértéket , amelynek tizedes törtje van. Ebben a helyzetben nem kereki a számértéket .

Megjegyzés:

Az Azure SQL Database-ben és a Microsoft Fabricben található SQL Database-ben a számbigintként fejezhető ki. Ez a funkció előnézetben van.

dátum

Az alábbi értékek egyikére feloldható kifejezés:

  • dátum
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • idő

Dátumként egy oszlopkifejezést, DATEADD kifejezést, sztringkonstanst vagy felhasználó által definiált változót fogad el. A sztringkonstansértékeket dátum/idő értékre kell feloldani. Használjon négyjegyű éveket a kétértelmű problémák elkerülése érdekében. A kétjegyű évekről további információt a Kiszolgáló konfigurációja: kétjegyű év leépítése című témakörben talál.

Visszatérési típusok

A metódus visszatérési érték adattípusa dinamikus. A visszatérési típus a megadott dateargumentumtól függ. Ha az érték date egy sztringkonstansdátum, DATEADD egy dátum/idő értéket ad vissza. Ha egy másik érvényes bemeneti adattípust ad datemeg, DATEADD ugyanazt az adattípust adja vissza. DATEADD Hibát jelez, ha a sztringkonstans másodpercmérete meghaladja a három tizedesjegyet (.nnn), vagy ha a sztringkonstans tartalmazza az időzóna eltolási részét.

Visszaadott érték

datepart argumentum

dayofyear, dayés weekday ugyanazt az értéket adja vissza.

Minden dátumpart és rövidítése ugyanazt az értéket adja vissza.

Ha a következők igazak:

  • datepart is month
  • a dátumhónap több nappal rendelkezik, mint a visszatérési hónap
  • a dátumnap nem létezik a visszatérési hónapban

DATEADD Ezután a visszatérési hónap utolsó napját adja vissza. Szeptembernek például 30 (harminc) napja van; ezért ezek az utasítások a következők 2024-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');

szám argumentum

A szám argumentum nem haladhatja meg a tét tartományát. Az alábbi utasításokban a szám argumentuma 1-gyel meghaladja a int tartományt .

SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');

Ezek az utasítások a következő hibaüzenetet adják vissza:

Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.

Megjegyzés:

Az Azure SQL Database-ben és a Microsoft Fabricben található SQL Database-ben a számbigintként fejezhető ki. Ez a funkció előnézetben van.

dátum argumentum

DATEADDnem fogadja el az adattípus tartományán kívüli értékre növekményes dátumargumentumot. A következő utasításokban a dátumértékhez hozzáadott számérték meghaladja a dátum adattípusának tartományát.

SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');

DATEADD A következő hibaüzenetet adja vissza:

Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.

Egy kisdátum és egy másodperces vagy tört másodperces dátumértékek visszaadása

A kisdátumérték másodperc része mindig 00. Kisdátum dátumérték esetén a következők érvényesek:

  • A dátumrészsecondés a -30 és a +29 közötti DATEADD esetében nem végez módosításokat.

  • Egy dátumrésznélsecondés egy -30-nál kisebb vagy +29-nél nagyobb DATEADD az összeadást egy perctől kezdve hajtja végre.

  • A -30001 és a +29998 közötti millisecond és DATEADD esetében nem végez módosításokat.

  • Egy -30001-nél kisebb vagy +29998-nál kisebb millisecond és DATEADD esetén az összeadás egy perctől kezdődik.

Megjegyzések

Használja DATEADD a következő záradékokban:

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

Tört másodperc pontossága

DATEADDnem teszi lehetővé a kisdátum,microsecond és dátum típusú adattípusok nanosecond vagy dátumának hozzáadását.

Az ezredmásodperc 3 (.123), a mikroszekundumok 6 (.123456), a nanoszekundumok 9 (.123456789) skálával rendelkeznek. Az idő, a datetime2 és a datetimeoffset adattípus maximális mérete 7 (.1234567). A dátumrészeknanosecondesetében a számnak 100-nak kell lennie a dátum tört másodpercének növekedése előtt. Egy 1 és 49 közötti szám lefelé kerekít 0-ra, egy 50 és 99 közötti szám pedig akár 100-ra is.

Ezek az utasítások dátumrészt adnak hozzá az millisecond, microsecondvagy 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);

Itt van az eredmények összessége.

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

Időzóna eltérése

DATEADD nem teszi lehetővé az időzóna-eltolás hozzáadását.

Példák

Egy. Dátumrész növelése 1 intervallummal

Mindegyik utasítás 1 intervallummal növeli a datepart értékét:

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

Itt van az eredmények összessége.

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. Több datepart szint növelése egy utasításban

Ezek az utasítások a datepart értéket olyan számmal növelik, amely elég nagy ahhoz, hogy a dátum következő magasabb dátumrészét is megnövelje:

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. Kifejezések használata argumentumként a szám- és dátumparaméterekhez

Ezek a példák különböző típusú kifejezéseket használnak a szám- és dátumparaméterek argumentumaként. A példák az AdventureWorks-adatbázist használják.

Oszlop megadása dátumként

Ez a példa (két) napot ad 2 hozzá az OrderDate oszlop minden értékéhez egy új, a következő nevű PromisedShipDateoszlop származtatásához:

SELECT SalesOrderID,
       OrderDate,
       DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;

Íme egy részleges eredményhalmaz:

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

Felhasználó által megadott változók megadása számként és dátumként

Ez a példa a felhasználó által definiált változókat adja meg a szám és a dátum argumentumaként:

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

Itt van az eredmények összessége.

2000-12-31 01:01:01.110

Skaláris rendszerfüggvény megadása dátumként

Ez a példa dátumot SYSDATETIMEad meg. A visszaadott pontos érték az utasítás végrehajtásának napjától és időpontjától függ:

SELECT DATEADD(month, 1, SYSDATETIME());

Itt van az eredmények összessége.

2024-04-25 14:29:59.6727944

Skaláris al lekérdezések és skaláris függvények megadása számként és dátumként

Ez a példa skaláris al lekérdezéseket használ szám és dátum argumentumakéntMAX(ModifiedDate). (SELECT TOP 1 BusinessEntityID FROM Person.Person)A számparaméter mesterséges argumentumaként szolgál, amely bemutatja, hogyan választhat ki számargumentumot egy értéklistából.

SELECT DATEADD(month,
    (SELECT TOP 1 BusinessEntityID FROM Person.Person),
    (SELECT MAX(ModifiedDate) FROM Person.Person)
);

Numerikus kifejezések és skaláris rendszerfüggvények megadása számként és dátumként

Ez a példa számkifejezést (-(10 / 2)), nem aritmetikai operátort (-), számtani operátort (/) és skaláris rendszerfüggvényt (SYSDATETIME) használ szám és dátum argumentumaként.

SELECT DATEADD(month, -(10 / 2), SYSDATETIME());

Rangsorolási függvények számként való megadása

Ez a példa egy rangsorolási függvényt használ szám argumentumaként.

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;

Összesített ablakfüggvény megadása számként

Ez a példa egy összegző ablakfüggvényt használ szám argumentumaként.

SELECT SalesOrderID,
       ProductID,
       OrderQty,
       DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO