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
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
koncový bod SQL Analytics ve službě Microsoft Fabric
Úložiště 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.
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 .
Syntaxe
DATEADD (datepart , number , date )
Argumenty
datepart
Část data, do které DATEADD
sečte číslo int.
Poznámka:
Ve službě Azure SQL Database je možné číslo ve službě Azure SQL Managed Instance a databáze SQL v Microsoft Fabric vyjádřit jako bigint. Tato funkce je ve verzi Preview.
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 | Zkratky |
---|---|
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 |
číslo
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.
Poznámka:
V Azure SQL Database a databázi SQL v Microsoft Fabric je možné číslo vyjádřit jako bigint. Tato funkce je ve verzi Preview.
datum
Výraz, který se dá přeložit na jednu z následujících hodnot:
- datum
- datum a čas
- datetimeoffset
- datetime2
- smalldatetime
- Čas
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 date
jiný 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
day
a 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 is
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.
Poznámka:
V Azure SQL Database a databázi SQL v Microsoft Fabric je možné číslo vyjádřit jako bigint. Tato funkce je ve verzi Preview.
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
second
a číselné hodnoty mezi -30 a +29DATEADD
se neprovádí žádné změny.Pro část
second
data a číselnou hodnotu menší než -30 nebo více než +29DATEADD
provede sčítání od jedné minuty.U části
millisecond
data a číselné hodnoty mezi -30001 a +29998DATEADD
se neprovádí žádné změny.U datové části
millisecond
a číselné hodnoty menší než -30001 nebo více než +29998DATEADD
provede sčítání od jedné minuty.
Poznámky
Použijte DATEADD
v následujících klauzulích:
GROUP BY
HAVING
ORDER BY
SELECT <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 částnanosecond
data 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í částmillisecond
data , microsecond
nebo 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.
Příklady
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