DATEADD (datepart , number , date )
- datepart
Część wartości date, do której jest dodawana wartość integer number. W poniższej tabeli wymieniowo wszystkie prawidłowe argumenty funkcji datepart. Zdefiniowane przez użytkownika odpowiedniki zmiennych 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że przyjmować wartość int, która jest dodawana do wartości datepart wartości date. Zmienne zdefiniowane przez użytkownika są prawidłowe.
W przypadku określenia wartości z ułamkiem dziesiętnym ułamek zostanie obcięty bez zaokrąglania.
- date
Wyrażenie, które może przyjmować wartość time, date, smalldatetime, datetime, datetime2 lub datetimeoffset. 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 przyjmować wartość datetime. Aby uniknąć niejednoznaczności, należy używać lat w formacie czterocyfrowym. Aby uzyskać informacje dotyczące lat w formacie dwucyfrowym, zobacz temat Konfigurowanie roku dwóch cyfr odcięcia opcji konfiguracji serwera.
Zwracanym typem danych jest typ argumentu date, z wyjątkiem literałów ciągów.
Zwracanym typem danych dla literału ciągu jest datetime. Wystąpi błąd, jeśli skala sekund literału ciągu ma więcej niż miejsca (. nnn) lub zawiera część przesunięcia strefy czasowej.
dayofyear, day iweekday zwracają tę samą wartość.
Każda funkcja datepart i jej skróty zwracają tę samą wartość.
Jeśli element datepart jest typu month, miesiąc dla date ma więcej dni niż zwracany miesiąc i dzień dla date nie istnieje w zwracanym miesiącu, jest zwracany ostatni dzień zwracanego miesiąca. Na przykład wrzesień ma 30 dni, więc dwie poniższe instrukcje zwracają 2006-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '2006-08-30')
SELECT DATEADD(month, 1, '2006-08-31')
Argument number nie może przekraczać zakresu int. W poniższych instrukcjach argument number przekracza zakres int o 1. Zostanie zwrócony następujący komunikat o błędzie: Błąd przepełnienia arytmetycznego podczas konwertowania wyrażenia na typ danych int.
SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');
Argument date nie może być zwiększony do wartości spoza zakresu jego typu danych. W poniższych instrukcjach wartość number dodawana do wartości date przekracza zakres typu danych date. Zostanie zwrócony następujący komunikat o błędzie: Dodanie wartości do kolumny „datetime” spowodowało przepełnienie.
SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');
Część reprezentująca sekundy wartości smalldatetime ma zawsze wartość 00. Jeśli date jest typu smalldatetime, stosowane są następujące zasady:
Jeśli datepart jest typu second a number jest z zakresu od -30 do +29, nie jest wykonywane żadne dodawanie.
Jeśli datepart jest typu second a number jest mniejsze niż -30 lub większe niż +29, wykonywane jest dodawanie rozpoczynające się od jednej minuty.
Jeśli datepart jest typu millisecond a number jest z zakresu od -30001 do +29998, nie jest wykonywane żadne dodawanie.
Jeśli datepart jest typu millisecond a number jest mniejsze niż -30001 lub większe niż +29998, wykonywane jest dodawanie rozpoczynające się od jednej minuty.
Funkcji DATEADD można używać w <listach> SELECT klauzul WHERE, HAVING, GROUP BY i ORDER BY.
Dokładność ułamkowych części sekund
Dodawanie części daty datepart, takich jak microsecond lub nanosecond, dla typów danych date, takich jak smalldatetime, date oraz datetime jest niedozwolone.
Skala dla milisekund to 3 (.123), a dla mikrosekund i nanosekund to odpowiednio 6 (.123456) i 9 (.123456789). Maksymalna skala w przypadku typów danych time, datetime2 i datetimeoffset to 7 (.1234567). Jeśli datepart jest typu (nanosecond, number musi być równe 100 przed zwiększeniem ułamkowych części sekund dla date. Wartość number z przedziału od 1 do 49 zostanie zaokrąglona w dół do 0; liczba z przedziału od 50 do 99 zostanie zaokrąglona w górę do 100.
Poniższe instrukcje spowodują dodanie wartości datepart typu 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
Dodawanie jest niedozwolone w przypadku przesunięcia strefy czasowej.
A.Zwiększanie części daty o interwał o wartości 1
Każda z następujących instrukcji zwiększa wartość datepart o interwał o wartości 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ż jednego poziomu części daty w jednej instrukcji
Każda z następujących instrukcji zwiększa wartość datepart o wartość number wystarczająco dużą, aby zwiększyć też następną wyższą wartość datepart dla 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.Używanie wyrażeń jako argumenty parametrów liczby i daty
W poniższych przykładach różne typy wyrażeń są używane jako argumenty parametrów number i date.
Określanie kolumny jako data
W poniższym przykładzie są dodawane 2 dni do każdej wartości OrderDate w celu obliczenia nowej wartości PromisedShipDate.
USE AdventureWorks2012;
GO
SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Określanie zmiennych zdefiniowanych przez użytkownika jako liczba i data
W poniższym przykładzie określono zmienne zdefiniowane przez użytkownika jako argumenty parametró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ślanie skalarnej funkcji systemowej jako data
W następnym przykładzie określono wartość SYSDATETIME dla parametru date.
SELECT DATEADD(month, 1, SYSDATETIME());
Określanie podzapytań skalarnych i funkcji skalarnych jako liczba i data
W poniższym przykładzie użyto podzapytań skalarnych, MAX(ModifiedDate), jako argumentów dla number i date. (SELECT TOP 1 BusinessEntityID FROM Person.Person) to sztuczny argument parametru liczba służący do wybrania argumentu number z listy wartości.
USE AdventureWorks2012;
GO
SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person));
Określanie stałych jako liczba i data
W poniższym przykładzie użyto stałych liczbowych i znakowych jako argumentów parametrów number i date.
SELECT DATEADD(minute, 1, ' 2007-05-07 09:53:01.0376635');
Określanie wyrażeń liczbowych i skalarnych funkcji systemowych jako liczba i data
W poniższym przykładzie wyrażenie liczbowe (-(10/2)), operatory jednoargumentowe (-), operator arytmetyczny (/) i skalarne funkcje systemowe (SYSDATETIME) są używane jako argumenty parametrów number i date.
SELECT DATEADD(month,-(10/2), SYSDATETIME());
Określanie funkcji klasyfikacji jako liczba
W poniższym przykładzie użyto funkcji klasyfikacji jako argument parametru number.
USE AdventureWorks2012;
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 funkcji okna agregacji jako liczba
W poniższym przykładzie użyto funkcji okna agregacji jako argument parametru number.
USE AdventureWorks2012;
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
Odwołanie