Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza 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ęści
seconddaty i wartości liczbowej z zakresu od -30 do +29DATEADDnie wprowadza żadnych zmian.W przypadku części
seconddaty i wartość liczbowa mniejsza niż -30 lub większa niż +29DATEADDwykonuje dodanie rozpoczynające się od jednej minuty.W przypadku części
milliseconddaty i wartości liczbowej z zakresu od -30001 do +29998DATEADDnie wprowadza żadnych zmian.W przypadku części daty i wartości
millisecondmniejszej 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 BYHAVINGORDER BYSELECT <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