Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics platformrendszer (PDW)
SQL-elemzési végpont a Microsoft Fabric
A 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 DATEADD
intszá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 date
argumentumtó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 date
meg, 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
DATEADD
nem 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ész
second
és a -30 és a +29 közöttiDATEADD
esetében nem végez módosításokat.Egy dátumrésznél
second
és egy -30-nál kisebb vagy +29-nél nagyobbDATEADD
az összeadást egy perctől kezdve hajtja végre.A -30001 és a +29998 közötti
millisecond
ésDATEADD
esetében nem végez módosításokat.Egy -30001-nél kisebb vagy +29998-nál kisebb
millisecond
ésDATEADD
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
DATEADD
nem 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észeknanosecond
eseté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
, microsecond
vagy 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ű PromisedShipDate
oszlop 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 SYSDATETIME
ad 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