Udostępnij za pośrednictwem


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.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

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

Zobacz także

Odwołanie