Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Tato funkce přidá číslo (celé číslo se signedm) do části datavstupu a vrátí upravenou hodnotu data a času. Pomocí této funkce můžete například najít datum, které je od dnešního dne 7 000 minut: číslo = 7000, datum = minuta, datum = dnes.
Tato funkce přidává číslo ( podepsanou bigintu) k datové částivstupního data a vrací upravenou hodnotu data/času. Pomocí této funkce můžete například najít datum, které je od dnešního dne 7 000 minut: číslo = 7000, datum = minuta, datum = dnes.
Přehled všech datových typů a funkcí Transact-SQL datových typů a funkcí data a času najdete v tématu Datum a čas .
Syntax
DATEADD ( datepart , number , date )
Arguments
datepart
Část data, do které DATEADD sečte číslo int.
Část datu , ke které DATEADD přidává bigintovéčíslo.
Tato tabulka obsahuje všechny platné argumenty části kalendářních dat.
DATEADD nepřijímá ekvivalenty proměnných definovaných uživatelem pro argumenty datové části .
| 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
Výraz, který se dá přeložit na int, který DATEADD se přidá do části data.
DATEADD přijímá uživatelem definované hodnoty proměnných pro číslo.
DATEADD zkrátí zadanou číselnou hodnotu, která má desetinnou desetinnou čárku. V této situaci nezaokrouhluje číselnou hodnotu.
Výraz, který se dá rozlišit na bigint , který DATEADD přidává k datové částidata.
DATEADD přijímá uživatelem definované hodnoty proměnných pro číslo.
DATEADD zkrátí zadanou číselnou hodnotu, která má desetinnou desetinnou čárku. V této situaci nezaokrouhluje číselnou hodnotu.
date
Výraz, který se dá přeložit na jednu z následujících hodnot:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Pro datumDATEADD přijímá výraz sloupce, výraz, řetězcový literál nebo uživatelem definovanou proměnnou. Řetězcová hodnota literálu se musí přeložit na datetime. Vyhnete se problémům s nejednoznačností pomocí čtyřmístných let. Informace o dvouciferných letech najdete v části Konfigurace serveru: dvouciferný rok .
Návratové typy
Datový typ návratové hodnoty pro tuto metodu je dynamický. Návratový typ závisí na argumentu zadaném pro date. Pokud je hodnota date řetězcového literálového data, DATEADD vrátí hodnotu datetime . Pokud je zadán datejiný platný vstupní datový typ , DATEADD vrátí stejný datový typ.
DATEADD vyvolá chybu, pokud měřítko řetězcového literálu sekund překračuje tři pozice desetinných míst (.nnn) nebo pokud řetězcový literál obsahuje část posunu časového pásma.
Návratová hodnota
Argument datepart
dayofyear
daya weekday vrátí stejnou hodnotu.
Každá část data a její zkratky vrátí stejnou hodnotu.
Pokud jsou splněné následující podmínky:
-
datepart je
month - měsíc kalendářního data má více dní, než je návratový měsíc.
- den data v návratovém měsíci neexistuje.
DATEADD Potom vrátí poslední den návratového měsíce. Například září má 30 (třicet) dnů; proto tyto příkazy vrátí 2024-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');
číselný argument
Číselný argument nemůže překročit rozsah int. V následujících příkazech argument pro číslo překračuje rozsah int o 1.
SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');
Oba tyto příkazy vrátí následující chybovou zprávu:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
Číselný argument nemůže překročit rozsah bigintu. V následujících tvrzeních argument pro číslo přesahuje rozsah bigintu o 1.
DECLARE @datetime2 AS DATETIME2;
SET @datetime2 = '2025-11-01 01:01:01.1111111';
SELECT DATEADD(nanosecond, 9223372036854775808, @datetime2);
SELECT DATEADD(nanosecond, -9223372036854775809, @datetime2);
GO
Oba tyto příkazy vrátí následující chybovou zprávu:
Msg 8115, Level 16, State 2, Line 3
Arithmetic overflow error converting expression to data type bigint.
Argument data
DATEADD nepřijme argument kalendářního data , který se zvýší na hodnotu mimo rozsah jeho datového typu. V následujících příkazech číselná hodnota přidaná k hodnotě data překračuje rozsah datového typu kalendářního data .
SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');
DATEADD vrátí následující chybovou zprávu:
Msg 517, Level 16, State 1
Line 1 Adding a value to a 'datetime' column caused overflow.
Vrácení hodnot pro datum smalldatetime a druhou nebo zlomkovou sekundu datepart
V sekundách je hodnota smalldatetime vždy 00. Pro hodnotu datasmalldatetime platí následující:
U datové části
seconda číselné hodnoty mezi -30 a +29DATEADDse neprovádí žádné změny.Pro část
seconddata a číselnou hodnotu menší než -30 nebo více než +29DATEADDprovede sčítání od jedné minuty.U části
milliseconddata a číselné hodnoty mezi -30001 a +29998DATEADDse neprovádí žádné změny.U datové části
milliseconda číselné hodnoty menší než -30001 nebo více než +29998DATEADDprovede sčítání od jedné minuty.
Remarks
Použijte DATEADD v následujících klauzulích:
GROUP BYHAVINGORDER BYSELECT <list>WHERE
Přesnost desetinné sekundy
DATEADD nepovoluje přidání části datamicrosecond nebo nanosecond datového typu datesmalldatetime, date a datetime.
Milisekundy mají měřítko 3 (.123), mikrosekundy mají měřítko 6 (.123456) a nanosekundy mají měřítko 9 (.123456789). Datové typy time, datetime2 a datetimeoffset mají maximální měřítko 7 (). .1234567 Pro částnanoseconddata musí být číslo 100 před desetinnou sekundou zvýšení data .
Číslo mezi 1 a 49 zaokrouhlí dolů na 0 a číslo od 50 do 99 zaokrouhlí nahoru na 100.
Tyto příkazy přidávají částmilliseconddata , microsecondnebo 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);
Tady je soubor výsledků.
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
Posun časového pásma
DATEADD neumožňuje přidání posunu časového pásma.
Examples
A. Přírůstková část data o interval 1
Každý z těchto příkazů zvýší hodnotu datepart o interval 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);
Tady je soubor výsledků.
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. Zvýšení více než jedné úrovně položky datepart v jednom příkazu
Každý z těchto příkazů zvýší hodnotu datepart o velké číslo, aby navíc zvětšil další vyšší část data data:
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. Použití výrazů jako argumentů pro parametry čísla a data
Tyto příklady používají různé typy výrazů jako argumenty pro parametry čísla a data . Příklady používají databázi AdventureWorks.
Zadání sloupce jako data
Tento příklad přidá 2 ke každé hodnotě OrderDate ve sloupci (dva) dny, aby se odvozoval nový sloupec s názvem PromisedShipDate:
SELECT SalesOrderID,
OrderDate,
DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Tady je částečná sada výsledků:
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
Zadání uživatelem definovaných proměnných jako čísla a data
Tento příklad určuje uživatelem definované proměnné jako argumenty pro číslo a 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);
Tady je soubor výsledků.
2000-12-31 01:01:01.110
Určení skalární systémové funkce jako data
Tento příklad určuje SYSDATETIME datum. Přesná vrácená hodnota závisí na dni a čase provádění příkazu:
SELECT DATEADD(month, 1, SYSDATETIME());
Tady je soubor výsledků.
2024-04-25 14:29:59.6727944
Určení skalárních poddotazů a skalárních funkcí jako čísla a data
V tomto příkladu se jako argumenty pro MAX(ModifiedDate) a datum používají skalární poddotazy.
(SELECT TOP 1 BusinessEntityID FROM Person.Person)slouží jako umělý argument parametru čísla, který ukazuje, jak vybrat číselný argument ze seznamu hodnot.
SELECT DATEADD(month,
(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person)
);
Určení číselných výrazů a skalárních systémových funkcí jako čísla a data
Tento příklad používá číselný výraz (-(10 / 2)), unární operátory (-), aritmetický operátor (/) a skalární systémové funkce (SYSDATETIME) jako argumenty pro číslo a datum.
SELECT DATEADD(month, -(10 / 2), SYSDATETIME());
Určení funkcí řazení jako čísla
Tento příklad používá funkci řazení jako argument pro číslo.
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;
Zadání agregační funkce okna jako čísla
Tento příklad používá agregační funkci okna jako argument pro číslo.
SELECT SalesOrderID,
ProductID,
OrderQty,
DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO