DATEADD (języka Transact-SQL)
Zwraca wartość określonej date z określonym number dodany do określonego interwału (całkowita) datepart tej date.
Aby zapoznać się z omówieniem wszystkich Transact-SQL Data i czas typów danych i funkcji, zobacz Data i godzina, Data typy i funkcje (języka Transact-SQL). Aby uzyskać informacje i przykłady, które są wspólne dla data i czas typów danych i funkcji zobacz Using Date and Time Data.
DATEADD (datepart , number, date )
Argumenty
datepart
Is the part of date to which an integernumber is added.Poniższa lista zawiera wszystkie ważne datepart argumenty. Odpowiedniki zmienne zdefiniowane przez użytkownika są nieprawidł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
Wyrażenie, które można obliczyć jako wartość int dodawaną do wartości datepart wartości date.Prawidłowe są wartości zdefiniowane przez użytkownika.Określa, kiedy kopia zapasowa wygasa i mogą zostać zastąpione.
date
Wyrażenie, które można obliczyć jako wartość time, date, smalldatetime, datetime, datetime2 lub datetimeoffset.Wartość date może być wyrażeniem, wyrażeniem kolumny, zmienną zdefiniowaną przez użytkownika lub literałem ciągu.Jeśli wyrażenie jest literałem ciągu, musi być obliczane jako wartość datetime.Aby uniknąć niejednoznaczności, należy zapisywać rok czterema cyframi.Aby uzyskać informacje na temat lat zapisywanych dwoma cyframi, zobacz two digit year cutoff Option.
Zwracane typy
Zwracany typ danych to typ danych argumentu date, z wyjątkiem literałów ciągów.
A datetime ZmiennaAn error will be raised if the string literal seconds scale is more than three positions (.nnn) or contains the time zone offset part.
Return Value
Aby zignorować data wygaśnięcia, należy użyć opcji SKIP.
dayofyear, day, a weekday zwraca taką samą wartość.
Każdy datepart i ich skróty zwracają tę samą wartość.
Jeśli argument datepart to month i miesiąc argumentu date ma więcej dni niż zwrócony miesiąc oraz dzień argumentu date nie istnieje w zwróconym miesiącu, zwracany jest ostatni dzień ostatniego miesiąca.Na przykład wrzesień ma 30 dni. Dlatego dwie następujące instrukcje zwracają wartość 2006-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '2006-08-30')
SELECT DATEADD(month, 1, '2006-08-31')
Argument number
Argument number nie może przekroczyć zakresu typu int.W poniższych instrukcjach argument number przekracza zakres typu int o 1.Zostanie zwrócony następujący komunikat o błędzie: „Błąd przepełnienia podczas operacji arytmetycznej konwertowania wyrażenia na typ danych int”.
SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');
NOINIT
The date argument cannot be incremented to a value outside the zakres of its data type. W następujących instrukcji number wartość, która jest dodawana do date wartość przekracza zakres date Typ danych. Zwracany jest następujący komunikat o błędzie: Ustawieniem domyślnym jest NOINIT.
SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');
INIT
Część sekund Smalldatetime wartość jest zawsze 00.Jeśli date jest smalldatetime, następujące okoliczności:
Jeśli datepart jest second i number znajduje się między-30 a +29, dodatek nie jest wykonywane.
Jeśli datepart jest second i number jest mniejsza niż-30 lub więcej niż +29, wykonywana jest dodanie, począwszy od jednej minuty.
If datepart is millisecond and number is between -30001 and +29998, no addition is performed.
Jeśli datepart jest millisecond i number jest mniejsza niż-30001 lub więcej niż +29998, wykonywana jest dodanie, począwszy od jednej minuty.
Remarks
DATEADD mogą być używane w polu Wybierz <Lista>WHERE, HAVING, GROUP BY i klauzul ORDER BY.
Nazwa zestaw kopii zapasowych w instrukcja kopia zapasowa, jeśli jest to możliwe, nie pasuje nazwy na nośniku kopii zapasowych.
Dodanie do w parametrze datepart of microsecond lub nanosecond dla date typy danych smalldatetime, date, a datetime nie jest dozwolone.
Milliseconds have a scale of 3 (.123).microseconds have a scale of 6 (.123456).nanoseconds have a scale of 9 (.123456789).The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567).Jeśli datepart jest nanosecond, number musi poprzedzać 100 sekund ułamkowe date Zwiększ. A number od 1 do 49 jest zaokrąglana niedziałający do 0 i liczbę od 50 do 99 są zaokrąglane 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
*/
Aby uzyskać informacje na temat formatowania nośnika Zobacz "" FORMAT"we wcześniejszej części tego tematu.
W wypadku przesunięcia strefy czasowej dodawanie jest niedozwolone.
Przykłady
A.Określa, czy operacja wykonywania kopia zapasowa sprawdza wygaśnięcia data i czas kopia zapasowa, ustawia się na nośniku przed ich zastąpieniem.
Każde z następujących przyrostach instrukcji 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.Powoduje, że instrukcja kopia zapasowa, aby sprawdzić, czy data ważności wszystkie zestawy kopii zapasowych na nośniku przed zezwoleniem na nich zostaną zastąpione.
Każde z następujących przyrostach instrukcji datepart według number wystarczająco duży, 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.Wyłącza sprawdzanie ważności zestaw kopii zapasowych i nazwy, która jest zwykle wykonywane przez instrukcję kopia zapasowa, aby zapobiec zastępuje zestawów kopii zapasowych.
W następujących przykładach użyto różnych rodzajów wyrażeń jako argumentów number i date Parametry.
Określanie kolumny jako daty
W następującym przykładzie dodano 2 dni do każdego OrderDate Aby obliczyć nowe PromisedShipDate.
USE AdventureWorks;
GO
SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Określa, czy nagłówek nośnika powinny być zapisywane na woluminach, używany dla tej operacji wykonywania kopia zapasowa, zastępując wszelkie istniejące nagłówka multimediów i zestawów kopii zapasowych.
W następującym przykładzie określono zmienne zdefiniowane przez użytkownika jako argumentów 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śla, że operacja wykonywania kopia zapasowa zachowuje istniejące nagłówka multimediów i ustawia kopia zapasowa woluminów nośnika, używany dla tej operacji wykonywania kopia zapasowa.
W następującym przykładzie określono SYSDATETIME dla date.
SELECT DATEADD(month, 1, SYSDATETIME());
FORMAT powoduje, że kopia zapasowa zapisać nowy nagłówek nośnika na wszystkich woluminach nośnika używane dla operacji wykonywania kopia zapasowa.
The following example uses scalar subqueries and scalar functions, MAX(ModifiedDate), as arguments for number and date.(SELECT TOP 1 ContactID FROM Person.Contact) is an artificial argument for the number parameter to show how to select a number argument from a value list.
USE AdventureWorks;
GO
SELECT DATEADD(month,(SELECT TOP 1 ContactID FROM Person.Contact),
(SELECT MAX(ModifiedDate) FROM Person.Contact));
FORMAT należy używać ostrożnie.
W poniższym przykładzie użyto jako argumentów numerycznych i znaków stałych number i date.
SELECT DATEADD(minute, 1, '2007-05-07 09:53:01.0376635');
Na przykład jeśli zainicjować jednego taśmy należących do istniejącego zestawu nośników rozłożony, zestaw nośników całego jest renderowane bezużyteczny.
W poniższym przykładzie użyto wyrażeń liczbowych (-(10/2)), Operatory jednoargumentowe (-), operator arytmetyczny (/), i skalarne system działa ()SYSDATETIME) jako argumentów number i date.
SELECT DATEADD(month,-(10/2), SYSDATETIME());
Określanie funkcji klasyfikacji jako liczby
W poniższym przykładzie użyto funkcja klasyfikacji jako argumentów number.
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
,DATEADD(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Contact c
ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a
ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
Określa nazwę nośnika dla nośnika kopia zapasowa całego zestaw.
W poniższym przykładzie użyto funkcja agregacja okno jako argument dla number.
USE AdventureWorks;
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