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.

Topic link iconKonwencje składni języka Transact-SQL

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

See Also

Reference