Udostępnij za pomocą


DATEADD (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Ta funkcja dodaje liczbę (podpisaną liczbę całkowitą) do części daty wejściowej i zwraca zmodyfikowaną wartość daty/godziny. Na przykład możesz użyć tej funkcji, aby znaleźć datę, która wynosi 7000 minut od dzisiaj: liczba = 7000, datapart = minuta, data = dzisiaj.

Funkcja ta dodaje liczbę ( podpisaną bigintę) do części datywejściowej i zwraca zmodyfikowaną wartość daty/godziny. Na przykład możesz użyć tej funkcji, aby znaleźć datę, która wynosi 7000 minut od dzisiaj: liczba = 7000, datapart = minuta, data = dzisiaj.

Zobacz Typy danych i funkcje daty i godziny, aby zapoznać się z omówieniem wszystkich Transact-SQL typów i funkcji danych daty i godziny.

Transact-SQL konwencje składni

Syntax

DATEADD ( datepart , number , date )

Arguments

datepart

Część daty, do której DATEADD dodaje liczbęint.

Część daty, do której DATEADD dodaje liczbębigint.

W tej tabeli wymieniono wszystkie prawidłowe argumenty elementów datepart . DATEADD nie akceptuje odpowiedników zmiennych zdefiniowanych przez użytkownika dla argumentów elementu datepart .

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

Wyrażenie, które może rozpoznać liczbę int dodaną DATEADD do części daty. DATEADD akceptuje wartości zmiennych zdefiniowanych przez użytkownika dla liczby. DATEADD obcina określoną wartość liczbową , która ma ułamek dziesiętny. Nie zaokrągla wartości liczbowej w tej sytuacji.

Wyrażenie, które może się rozłożyć na bigint , dodając DATEADD do randki częścidaty. DATEADD akceptuje wartości zmiennych zdefiniowanych przez użytkownika dla liczby. DATEADD obcina określoną wartość liczbową , która ma ułamek dziesiętny. Nie zaokrągla wartości liczbowej w tej sytuacji.

date

Wyrażenie, które może rozpoznać jedną z następujących wartości:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

W przypadku datyDATEADD akceptuje wyrażenie kolumny, wyrażenie, literał ciągu lub zmienną zdefiniowaną przez użytkownika. Wartość literału ciągu musi być rozpoznawana jako data/godzina. Użyj czterocyfrowych lat, aby uniknąć problemów z niejednoznacznością. Zobacz Konfiguracja serwera: dwucyfrowe odcięcie roku , aby uzyskać informacje o dwóch cyfrach lat.

Typy zwracane

Zwracany typ danych wartości dla tej metody jest dynamiczny. Typ zwracany zależy od argumentu podanego dla dateelementu . Jeśli wartość parametru date jest datą literału ciągu, DATEADD zwraca wartość typu data/godzina . Jeśli dla elementu zostanie podany dateinny prawidłowy typ danych wejściowych , DATEADD zwraca ten sam typ danych. DATEADD zgłasza błąd, jeśli skala literału ciągu w sekundach przekracza trzy pozycje miejsca dziesiętnego (.nnn) lub jeśli literał ciągu zawiera część przesunięcia strefy czasowej.

Wartość zwracana

argument datepart

dayofyear, dayi weekday zwraca tę samą wartość.

Każdy element datepart i jego skróty zwracają tę samą wartość.

Jeśli spełnione są następujące warunki:

  • datepart to month
  • miesiąc daty ma więcej dni niż miesiąc powrotu
  • dzień daty nie istnieje w miesiącu zwrotnym

DATEADD Następnie zwraca ostatni dzień miesiąca zwrotu. Na przykład wrzesień ma 30 (trzydzieści) dni; w związku z tym następujące instrukcje zwracają następujące 2024-09-30 00:00:00.000instrukcje:

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

argument number

Argument liczbowy nie może przekraczać zakresu liczby int. W poniższych instrukcjach argument liczby przekracza zakres int o 1.

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

Obie te instrukcje zwracają następujący komunikat o błędzie:

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

Argument liczbowy nie może przekroczyć zakresu biginty. W poniższych stwierdzeniach argument dla liczby przekracza zakres biginty 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

Obie te instrukcje zwracają następujący komunikat o błędzie:

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

argument daty

DATEADD Nie akceptuje argumentu daty zwiększanego do wartości spoza zakresu jego typu danych. W poniższych instrukcjach wartość liczbowa dodana do wartości daty przekracza zakres typu danych daty .

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

DATEADD Zwraca następujący komunikat o błędzie:

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

Zwracanie wartości dla daty smalldatetime i części daty w sekundach lub ułamkowych

Część sekund wartości smalldatetime jest zawsze 00. W przypadku wartości datysmalldatetime należy zastosować następujące elementy:

  • W przypadku częściseconddaty i wartości liczbowej z zakresu od -30 do +29 DATEADD nie wprowadza żadnych zmian.

  • W przypadku częściseconddaty i wartość liczbowa mniejsza niż -30 lub większa niż +29 DATEADD wykonuje dodanie rozpoczynające się od jednej minuty.

  • W przypadku częścimillisecond daty i wartości liczbowej z zakresu od -30001 do +29998 DATEADD nie wprowadza żadnych zmian.

  • W przypadku części daty i wartości millisecond mniejszej niż -30001 lub więcej niż +29998DATEADD, wykonuje dodanie rozpoczynające się od jednej minuty.

Remarks

Użyj DATEADD w następujących klauzulach:

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

Precyzja ułamkowa sekund

DATEADDNie zezwala na dodawanie częścimicrosecond daty lub nanosecond dla typów danych datasmalldatetime, date i datetime.

Milisekundy mają skalę 3 (.123), mikrosekundy mają skalę 6 (.123456), a nanosekundy mają skalę 9 (.123456789). Typy danych time, datetime2 i datetimeoffset mają maksymalną skalę 7 (). .1234567 W przypadku częścinanoseconddaty liczba musi być 100 przed ułamkowe sekundy wzrostu daty . Liczba z zakresu od 1 do 49 zaokrągla w dół do 0, a liczba z 50 do 99 zaokrągleń do 100.

Te instrukcje dodają częśćmilliseconddaty , microsecondlub 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);

Oto zestaw wyników.

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

Przesunięcie strefy czasowej

DATEADD nie zezwala na dodawanie przesunięcia strefy czasowej.

Examples

A. Część daty przyrostowej według interwału 1

Każda z tych instrukcji zwiększa element datepart o interwał 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);

Oto zestaw wyników.

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. Zwiększanie więcej niż jednego poziomu składnika datepart w jednej instrukcji

Każda z tych instrukcji zwiększa część daty oliczbę wystarczająco dużą, aby dodatkowo zwiększać kolejną wyższą część daty:

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. Użyj wyrażeń jako argumentów dla parametrów liczby i daty

W tych przykładach użyto różnych typów wyrażeń jako argumentów dla parametrów liczby i daty . W przykładach użyto bazy danych AdventureWorks.

Określanie kolumny jako daty

W tym przykładzie do każdej wartości w kolumnie 2 dodano OrderDate (dwa) dni, aby uzyskać nową kolumnę o nazwie PromisedShipDate:

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

Oto zestaw wyników częściowych:

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

Określanie zmiennych zdefiniowanych przez użytkownika jako liczby i daty

W tym przykładzie określono zmienne zdefiniowane przez użytkownika jako argumenty dla liczby i daty:

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

Oto zestaw wyników.

2000-12-31 01:01:01.110

Określ funkcję systemu skalarną jako datę

W tym przykładzie SYSDATETIMEokreślono datę. Dokładna zwrócona wartość zależy od dnia i godziny wykonania instrukcji:

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

Oto zestaw wyników.

2024-04-25 14:29:59.6727944

Określanie podzapytania skalarnego i funkcji skalarnych jako liczby i daty

W tym przykładzie użyto podzapytania skalarnych, MAX(ModifiedDate), jako argumentów dla liczby i daty. (SELECT TOP 1 BusinessEntityID FROM Person.Person)służy jako sztuczny argument dla parametru number, aby pokazać, jak wybrać argument liczbowy z listy wartości.

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

Określanie wyrażeń liczbowych i funkcji systemu skalarnego jako liczby i daty

W tym przykładzie użyto wyrażenia liczbowego (-(10 / 2)), operatorów jednoargumentowych (-), operatora arytmetycznego (/) i funkcji systemu skalarnego (SYSDATETIME) jako argumentów liczby idaty.

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

Określanie funkcji klasyfikacji jako liczby

W tym przykładzie użyto funkcji klasyfikacji jako argumentu dla liczby.

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;

Określanie funkcji okna agregacji jako liczby

W tym przykładzie użyto funkcji okna agregacji jako argumentu dla liczby.

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