DATEADD (Transact-SQL)
Zwraca określony date o określonym number Interwał (całkowita) dodane do określonej datepart tego date.
Przegląd wszystkich Transact-SQL data i czas typów danych i funkcji, zobacz Funkcje daty i godziny (Transact-SQL).Informacje i przykłady, które są wspólne dla data i czas typów danych i funkcji, zobacz Data i czas danych.
Składnia
DATEADD (datepart , number , date )
Argumenty
datepart
Jest to część date do której integernumber jest dodawany.W poniższej tabela wymieniono wszystkie prawidłowe datepart argumentów.Odpowiedniki zmienne zdefiniowane przez użytkownika nie są prawidłowe.datepart
Skróty
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
To wyrażenie , które może być przetłumaczona na int dodaje się datepart z date.Zmienne zdefiniowane przez użytkownika są prawidłowe.Określ wartość z ułamek dziesiętny frakcji jest obcięta i nie jest zaokrąglana.
date
To wyrażenie , które może być przetłumaczona na time, date, smalldatetime, datetime, datetime2, lub datetimeoffset wartości.datemoże być wyrażenie,wyrażenie kolumna, zmienna zdefiniowane przez użytkownika lub ciąg literału. Jeśli wyrażenie jest ciąg literału, należy rozwiązać do datetime.Aby uniknąć niejednoznaczności, za pomocą czterech cyfr.Aby uzyskać informacje o dwóch cyfr, zobacz Opcja dwie cyfry roku odcięcia.
Zwracane typy
Typ zwracanych danych jest typ danych date argument, z wyjątkiem literałów ciąg .
Wpisz zwracanych danych jest literałem ciąg datetime.Błąd będzie uruchamiany, jeśli Skala sekund literału ciąg jest więcej niż trzy stanowiska (.nnn) lub zawiera czas strefy przesunięcie części.
Ostrzeżenie
Jeśli literały ciągów ciąg nie są jawnie oddanych na date parametr, a następnie zmiennych lokalnych używających dzień miesiąc rok (dmy) data format mogą pobrać niepoprawne wyniki , gdy DATEADD jest używany w połączeniu z innymi data/czas funkcji.
Zwracanie typu datetime2
Zwraca DATEADD datetime2 należy wpisać po date parametr jest datetime2 typu.Podczas używania literały ciągów ciąg dla date parametr, a następnie użytkownik jawnie musi oddanych im datetime2 typu DATEADD zwrotu datetime2 typu.
DatePart Argument
dayofyear, day, i weekday zwraca te same wartości.
Każdy datepart i jego skróty zwraca te same wartości.
Jeśli datepart jest month i date miesiąc ma więcej dni niż miesiąc zwrotu i date dnia nie istnieje w miesiącu zwrotu, zwracany jest ostatni dzień miesiąca zwrotu.Na przykład września ma 30 dni; 2006-09-30 00:00:00.000 zwracają więc dwa następujące instrukcje:
SELECT DATEADD(month, 1, '2006-08-30')
SELECT DATEADD(month, 1, '2006-08-31')
number Argument nie może przekraczać zakres int.W sprawozdaniu następujący argument dla number przekracza zakres int przez 1.Zwracany jest następujący komunikat o błędzie: "Przepełnienie arytmetyczne błąd konwersji danych typu int. wyrażenie
SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');
date Argument nie może być zwiększany wartość spoza zakres jego typu danych.W następujących instrukcji number wartość, która jest dodawana do date wartość przekracza zakres date typu danych.Zwracany jest następujący komunikat o błędzie: "dodanie wartości datetime kolumna spowodowała przepełnienie."
SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');
Część sekund smalldatetime wartość jest zawsze 00.Jeśli date jest smalldatetime, stosuje się następujące:
Jeśli datepart jest second i number wynosi-30-+29, nie jest wykonywane.
Jeśli datepart jest second i number jest mniejsza niż-30 lub więcej niż +29, wykonywane jest dodanie rozpoczynające się na jedną minutę.
Jeśli datepart jest millisecond i number wynosi-30001-+29998, nie jest wykonywane.
Jeśli datepart jest millisecond i number jest mniejsza niż-30001 lub więcej niż +29998, wykonywane jest dodanie rozpoczynające się na jedną minutę.
Uwagi
DATEADD mogą być używane w polu Wybierz <listę>, gdzie występują, klauzule Grupuj według i ORDER BY.
Dokładność ułamkową sekund
Dodanie do datepart z microsecond lub nanosecond dla date typów danych smalldatetime, date, i datetime nie jest dozwolona.
Skala 3 mają milisekund (. 123).mikrosekund mają skali 6 (. 123456).nanosekundach mają skali 9 (. 123456789).time, datetime2, I datetimeoffset typy danych mają maksymalną skalę 7 (. 1234567).Jeśli datepart jest nanosecond, number musi być 100 przed pobieraniem sekund date wzrostu.A number między 1 a 49 jest zaokrąglana niedziałający 0 i liczby z zakresu od 50 do 99 jest zaokrąglana do 100.
Dodaj następujące instrukcje datepart z millisecond, microsecond, lub nanosecond.
DECLARE @datetime2 datetime2 = '2007-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);
/*
Returns:
1 millisecond 2007-01-01 13:10:10.1121111
2 milliseconds 2007-01-01 13:10:10.1131111
1 microsecond 2007-01-01 13:10:10.1111121
2 microseconds 2007-01-01 13:10:10.1111131
49 nanoseconds 2007-01-01 13:10:10.1111111
50 nanoseconds 2007-01-01 13:10:10.1111112
150 nanoseconds 2007-01-01 13:10:10.1111113
*/
Przesunięcie strefy czasowej
Dodatek nie jest dozwolone dla czas przesunięcie strefy.
Przykłady
A.Przyroście datepart interwał równy 1
Każdy z pełnymi następujące instrukcje datepart przez interwał równy 1.
DECLARE @datetime2 datetime2 = '2007-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);
/*
Year 2008-01-01 13:10:10.1111111
quarter 2007-04-01 13:10:10.1111111
month 2007-02-01 13:10:10.1111111
dayofyear 2007-01-02 13:10:10.1111111
day 2007-01-02 13:10:10.1111111
week 2007-01-08 13:10:10.1111111
weekday 2007-01-02 13:10:10.1111111
hour 2007-01-01 14:10:10.1111111
minute 2007-01-01 13:11:10.1111111
second 2007-01-01 13:10:11.1111111
millisecond 2007-01-01 13:10:10.1121111
microsecond 2007-01-01 13:10:10.1111121
nanosecond 2007-01-01 13:10:10.1111111
*/
B.Zwiększanie więcej niż jeden poziom w jednej instrukcjaw parametrze datepart
Każdego z pełnymi następujące instrukcje datepart przez number wystarczająco duże, aby również zwiększać następnej wyższej datepart z date.
DECLARE @datetime2 datetime2;
SET @datetime2 = '2007-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter,4,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(month,13,@datetime2); --2008-02-01 01:01:01.110
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(day,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(week,5,@datetime2); --2007-02-05 01:01:01.110
SELECT DATEADD(weekday,31,@datetime2); --2007-02-01 01:01:01.110
SELECT DATEADD(hour,23,@datetime2); --2007-01-02 00:01:01.110
SELECT DATEADD(minute,59,@datetime2); --2007-01-01 02:00:01.110
SELECT DATEADD(second,59,@datetime2); --2007-01-01 01:02:00.110
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110
C.Jako argumenty dla parametrów numer i data przy użyciu wyrażeń
W następujących przykładach użyto różnych typów wyrażeń jako argumentów dla number i date Parametry.
Określanie kolumna jako data
W następującym przykładzie dodano 2 dni dla każdego OrderDate do obliczania nowy PromisedShipDate.
USE AdventureWorks2008R2;
GO
SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Określanie zmienne zdefiniowane przez użytkownika jako numer i data
W następującym przykładzie określono zmienne zdefiniowane przez użytkownika jako argumentów dla number i date.
DECLARE @days int;
DECLARE @datetime datetime;
SET @days = 365;
SET @datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);
Określanie systemu wartość skalarna funkcja jako data
W następującym przykładzie określono SYSDATETIME dla date.
SELECT DATEADD(month, 1, SYSDATETIME());
Określanie podkwerend wartość skalarna i funkcji wartość skalarna jak numer i data
W poniższym przykładzie użyto podkwerend wartość skalarna i funkcjiwartość skalarna, MAX(ModifiedDate), jako argumentów dla number i date.(SELECT TOP 1 BusinessEntityID FROM Person.Person)sztuczne argument dla parametru numerów wybierz sposób jest number argumentu z listy wartości.
USE AdventureWorks2008R2;
GO
SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person));
Określanie stałych jak numer i data
W poniższym przykładzie użyto stałych liczb i znaków jako argumentów dla number i date.
SELECT DATEADD(minute, 1, '2007-05-07 09:53:01.0376635');
Określanie wyrażeń liczbowych ifunkcje systemowe wartość skalarnajak numer i data
W poniższym przykładzie użyto wyrażeń liczbowych (-(10/2)), operatory jednoargumentowe (-), operatorarytmetyczny (/) ifunkcje systemowe wartość skalarna( SYSDATETIME) jako argumentów dla number i date.
SELECT DATEADD(month,-(10/2), SYSDATETIME());
Określanie funkcji klasyfikacji jako numer
W poniższym przykładzie użyto funkcja klasyfikacji jako argumentów dla number.
USE AdventureWorks2008R2;
GO
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 okno funkcja wartość zagregowana jako numer
W poniższym przykładzie użyto okna funkcja wartość zagregowana jako argument dla number.
USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
,DATEADD(day,SUM(OrderQty)
OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
D.Za pomocą DATEADD dla ustawień regionalnych, korzystające z formatu data dmy
Następujące przykłady przedstawiają metody korzystania literały ciągów ciąg z DATEADD dla niektórych ustawień regionalnych.
Wykazaniu niebezpieczeństwa używania niejawna oddanych ciąg literału
Poniższy przykład pokazuje, co się dzieje, gdy nie jest jawnie oddanych ciąg literału.
SET LANGUAGE Español;
GO
SELECT DATENAME(m, DATEADD(d, 0,'1987-03-07'));
SELECT DATENAME(m, '1987-03-07');
GO
Pierwszy wybierz zwracanych przez instrukcja julio (od lipca) dla miesiąca, a druga instrukcja zwrotu select marzo (marzec) dla miesiąca.
Unikanie błędnych wyniki przez rzutowanie jawnie ciąg literału
Poniższy przykład ilustruje sposób do oddania jawnie date parametr w celu uniknięcia błędnych wyniki.
SET LANGUAGE Español;
GO
SELECT DATENAME(m, DATEADD(d, 0, CAST('1987-03-07' AS datetime2)));
SELECT DATENAME(m, '1987-03-07');
GO
Zaznacz oba instrukcji return marzo (marzec) dla miesiąca.
Za pomocą zmiennej datetime2 zamiast ciąg literału
Poniższy przykład pozwala uniknąć bezpośredniego wykorzystania ciąg literału.
SET LANGUAGE Español;
GO
DECLARE @d datetime2 = '1987-03-07';
SELECT DATENAME(m, DATEADD(d, 0, @d));
SELECT DATENAME(m, @d);
GO