Sdílet prostřednictvím


DATEADD (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 .

Transact-SQL konvence syntaxe

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 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 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é částiseconda číselné hodnoty mezi -30 a +29 DATEADD se neprovádí žádné změny.

  • Pro částseconddata a číselnou hodnotu menší než -30 nebo více než +29 DATEADD provede sčítání od jedné minuty.

  • U částimillisecond data a číselné hodnoty mezi -30001 a +29998 DATEADD se neprovádí žádné změny.

  • U datové částimillisecond a číselné hodnoty menší než -30001 nebo více než +29998 DATEADD 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 čá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.

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