DATEADD (Transact-SQL)DATEADD (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ ЭТОЙ СТАТЬИ: даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Эта функция добавляет указанное значение number (целое число со знаком) к заданному аргументу datepart входного значения date, а затем возвращает это измененное значение.This function adds a specified number value (as a signed integer) to a specified datepart of an input date value, and then returns that modified value.

Обзор всех типов данных и функций даты и времени в языке Transact-SQLTransact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQLTransact-SQL date and time data types and functions.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

DATEADD (datepart , number , date )  

АргументыArguments

datepartdatepart
Компонент даты date, к которому DATEADD добавляет integer number.The part of date to which DATEADD adds an integer number. В приведенной ниже таблице перечислены все допустимые аргументы datepart.This table lists all valid datepart arguments.

Примечание

DATEADD не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.DATEADD does not accept user-defined variable equivalents for the datepart arguments.

datepartdatepart СокращенияAbbreviations
yearyear yy, yyyyyy, yyyy
quarterquarter qq, qqq, q
monthmonth mm, mmm, m
dayofyeardayofyear dy, ydy, y
dayday dd, ddd, d
weekweek wk, wwwk, ww
weekdayweekday dw, wdw, w
hourhour ччhh
minuteminute mi, nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

numbernumber
Выражение, которое разрешается в тип int, добавляемый DATEADD к компоненту datepart даты date.An expression that can resolve to an int that DATEADD adds to a datepart of date. DATEADD принимает определяемые пользователем значения переменных для number.DATEADD accepts user-defined variable values for number. DATEADD усечет указанное значение number, имеющее десятичную дробь.DATEADD will truncate a specified number value that has a decimal fraction. В этой ситуации значение number не округляется.It will not round the number value in this situation.

datedate
Выражение, которое может быть разрешено в одно из следующих значений.An expression that can resolve to one of the following values:

  • datedate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • timetime

Для date DATEADD будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную.For date, DATEADD will accept a column expression, expression, string literal, or user-defined variable. Значение строкового литерала должно разрешаться в datetime.A string literal value must resolve to a datetime. Во избежание неоднозначности используйте четырехзначную запись года.Use four-digit years to avoid ambiguity issues. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.See Configure the two digit year cutoff Server Configuration Option for information about two-digit years.

Типы возвращаемых данныхReturn types

Тип данных аргумента date становится типом данных возвращаемого значения DATEADD. Исключение составляют значения date строкового литерала.The date argument data type becomes the DATEADD return value data type, except for string literal date values. Для строкового литерала DATEADD возвращает значение datetime.For a string literal, DATEADD returns a datetime value. Если строковый литерал имеет более трех позиций долей секунды (.nnn) или если строковый литерал содержит часть смещения часового пояса, DATEADD выдаст ошибку.DATEADD will raise an error if the string literal seconds scale exceeds three decimal place positions (.nnn) or if the string literal contains the time zone offset part.

Возвращаемое значениеReturn Value

Аргумент datepartdatepart Argument

Функции dayofyear, day и weekday возвращают одинаковое значение.dayofyear, day, and weekday return the same value.

Каждое выражение datepart и его краткие формы возвращают одно и то же значение.Each datepart and its abbreviations return the same value.

Если верны следующие условия:If the following are true:

  • datepart имеет значение month;datepart is month
  • в месяце date больше дней, чем в возвращаемом месяце;the date month has more days than the return month
  • день date не существует в этом месяце;the date day does not exist in the return month

то DATEADD возвращает последний день возвращаемого месяца.Then, DATEADD returns the last day of the return month. Например, в сентябре 30 (тридцать) дней, поэтому эти инструкции возвращают 2006-09-30 00:00:00.000:For example, September has 30 (thirty) days; therefore, these statements return 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '20060831');

Аргумент numbernumber Argument

Аргумент number не может выходить за диапазон типа данных int. В приведенных ниже инструкциях аргумент number превышает диапазон типа данных int на 1.The number argument cannot exceed the range of int. In the following statements, the argument for number exceeds the range of int by 1. Обе эти инструкции возвращают сообщение об ошибке: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."These statements both return the following error message: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

SELECT DATEADD(year,2147483648, '20060731');  
SELECT DATEADD(year,-2147483649, '20060731');  

Аргумент datedate Argument

DATEADD не будет принимать аргумент date, увеличенный до значения, выходящего за диапазон соответствующего типа данных.DATEADD will not accept a date argument incremented to a value outside the range of its data type. В приведенных ниже инструкциях значение number, добавленное к значению date, превышает диапазон типа данных date.In the following statements, the number value added to the date value exceeds the range of the date data type. DATEADD возвращает следующее сообщение об ошибке: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow".DATEADD returns the following error message: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."

SELECT DATEADD(year,2147483647, '20060731');  
SELECT DATEADD(year,-2147483647, '20060731');  

Возвращаемые значения дат с типом данных smalldatetime и частью даты в виде секунд или долей секунды.Return Values for a smalldatetime date and a second or Fractional Seconds datepart

Значение секунд даты типа smalldatetime всегда равно 00.The seconds part of a smalldatetime value is always 00. Для значения date типа smalldatetime действуют указанные ниже условия.For a smalldatetime date value, the following apply:

  • Для части даты datepart секунды second и значения number в диапазоне от –30 до +29 DATEADD не вносит никаких изменений.For a datepart of second, and a number value between -30 and +29, DATEADD makes no changes.
  • Для части даты datepart секунды second и значения number меньше –30 или больше +29 DATEADD выполняет добавление, начиная с одной минуты.For a datepart of second, and a number value less than -30, or more than +29, DATEADD performs its addition beginning at one minute.
  • Для части даты datepart миллисекунды millisecond и значения number в диапазоне от –30 001 до + 29 998 DATEADD не вносит никаких изменений.For a datepart of millisecond and a number value between -30001 and +29998, DATEADD makes no changes.
  • Для части даты datepart миллисекунды millisecond и значения number меньше –30 001 или больше +29 998 DATEADD выполняет добавление, начиная с одной минуты.For a datepart of millisecond and a number value less than -30001, or more than +29998, DATEADD performs its addition beginning at one minute.

RemarksRemarks

Используйте DATEADD в следующих предложениях.Use DATEADD in the following clauses:

  • GROUP BYGROUP BY
  • HAVINGHAVING
  • ORDER BYORDER BY
  • SELECT <list>SELECT <list>
  • WHEREWHERE

Точность в долях секундыFractional seconds precision

DATEADD не допускает использование при сложении в качестве аргумента datepart значений microsecond или nanosecond для типов данных date: smalldatetime, date и datetime.DATEADD does not allow addition for a datepart of microsecond or nanosecond for date data types smalldatetime, date, and datetime.

Миллисекунды имеют точность 3 знака (0,123), микросекунды — 6 знаков (0,123456), наносекунды — 9 знаков (0,123456789).Milliseconds have a scale of 3 (.123), microseconds have a scale of 6 (.123456), and nanoseconds have a scale of 9 (.123456789). Типы данных time, datetime2 и datetimeoffset имеют максимальную точность 7 знаков (0,1234567).The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). Если аргументом datepart является nanosecond, аргумент number должен иметь значение 100 перед увеличением даты date на доли секунды.For a datepart of nanosecond, number must be 100 before the fractional seconds of date increase. number от 1 до 49 округляется до 0, а number от 50 до 99 округляется до 100.A number between 1 and 49 will round down to 0, and a number from 50 to 99 rounds up to 100.

Эти инструкции добавляют часть даты datepart: millisecond, microsecond или nanosecond.These statements add a datepart of millisecond, microsecond, or 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);  

Ниже приводится результирующий набор.Here is the result set.

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  

Смещение часового поясаTime zone offset

DATEADD не допускает добавление для смещения часового пояса.DATEADD does not allow addition for time zone offset.

ПримерыExamples

A.A. Увеличение части даты на интервал, равный 1Incrementing datepart by an interval of 1

Каждая из этих инструкций увеличивает часть даты datepart на интервал, равный 1.Each of these statements increments datepart by an interval of 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);  

Ниже приводится результирующий набор.Here is the result set.

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. Увеличение нескольких уровней части даты в одной инструкцииIncrementing more than one level of datepart in one statement

Каждая из этих инструкций увеличивает часть даты datepart на число number, достаточно большое, чтобы также увеличить следующую часть datepart даты date.Each of these statements increments datepart by a number large enough to additionally increment the next higher datepart of 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.1111111  
SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.1111111  
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.1111111  
SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.1111111  
SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.1111111  
SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.1111111  
SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.1111111  
SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.1111111  
SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.1111111  
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.1121111  

В.C. Использование выражений в качестве аргументов number и dateUsing expressions as arguments for the number and date parameters

В этих примерах выражения различного типа используются в качестве аргументов для параметров number и date.These examples use different types of expressions as arguments for the number and date parameters. В примерах используется база данных AdventureWorks.The examples use the AdventureWorks database.

Указание столбца в качестве аргумента dateSpecifying a column as date

В этом примере к каждому значению в столбце 2 добавляется OrderDate (два) дня, чтобы получить новый столбец с именем PromisedShipDate.This example adds 2 (two) days to each value in the OrderDate column, to derive a new column named PromisedShipDate:

SELECT SalesOrderID  
    ,OrderDate   
    ,DATEADD(day,2,OrderDate) AS PromisedShipDate  
FROM Sales.SalesOrderHeader;  

Частичный результирующий набор имеет следующий вид:A partial result set:

SalesOrderID OrderDate               PromisedShipDate  
------------ ----------------------- -----------------------  
43659        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000  
43660        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000  
43661        2005-07-01 00:00:00.000 2005-07-03 00:00:00.000  
...  
43702        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43703        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43704        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43705        2005-07-02 00:00:00.000 2005-07-04 00:00:00.000  
43706        2005-07-03 00:00:00.000 2005-07-05 00:00:00.000  
...  
43711        2005-07-04 00:00:00.000 2005-07-06 00:00:00.000  
43712        2005-07-04 00:00:00.000 2005-07-06 00:00:00.000  
...  
43740        2005-07-11 00:00:00.000 2005-07-13 00:00:00.000  
43741        2005-07-12 00:00:00.000 2005-07-14 00:00:00.000  

Указание пользовательских переменных в качестве аргументов number и dateSpecifying user-defined variables as number and date

В этом примере в качестве аргументов number и date указываются пользовательские переменные.This example specifies user-defined variables as arguments for number and date:

DECLARE @days int = 365,   
        @datetime datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;  
SELECT DATEADD(day, @days, @datetime);  

Ниже приводится результирующий набор.Here is the result set.

-----------------------  
2000-12-31 01:01:01.110  

(1 row(s) affected)  

Указание в качестве аргумента date скалярной системной функцииSpecifying scalar system function as date

В этом примере для аргумента date указано значение SYSDATETIME.This example specifies SYSDATETIME for date. Точное возвращаемое значение зависит от дня и времени выполнения инструкции.The exact value returned depends on the day and time of statement execution:

SELECT DATEADD(month, 1, SYSDATETIME());  

Ниже приводится результирующий набор.Here is the result set.

---------------------------  
2013-02-06 14:29:59.6727944  

(1 row(s) affected)  

Указание в качестве аргументов number и date скалярных вложенных запросов и скалярных функцийSpecifying scalar subqueries and scalar functions as number and date

В этом примере в качестве аргументов для number и date используются скалярные вложенные запросы MAX(ModifiedDate).This example uses scalar subqueries, MAX(ModifiedDate), as arguments for number and date. (SELECT TOP 1 BusinessEntityID FROM Person.Person) является искусственным аргументом для числового параметра, показывающим способ выбора аргумента number из списка значений.(SELECT TOP 1 BusinessEntityID FROM Person.Person) serves as an artificial argument for the number parameter, to show how to select a number argument from a value list.

SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),  
    (SELECT MAX(ModifiedDate) FROM Person.Person));  

Указание в качестве аргументов number и date числовых выражений и скалярных системных функцийSpecifying numeric expressions and scalar system functions as number and date

В этом примере в качестве аргументов number и date используется числовое выражение (–(10/2)), унарные операторы (-), арифметический оператор (/) и скалярные системные функции (SYSDATETIME).This example uses a numeric expression (-(10/2)), unary operators (-), an arithmetic operator (/), and scalar system functions (SYSDATETIME) as arguments for number and date.

SELECT DATEADD(month,-(10/2), SYSDATETIME());  

Указание в качестве аргумента number ранжирующих функцийSpecifying ranking functions as number

В этом примере в качестве аргумента number используется ранжирующая функция.This example uses a ranking function as an argument for number.

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;  

Указание в качестве аргумента number статистической оконной функцииSpecifying an aggregate window function as number

В этом примере в качестве аргумента number используется агрегатная оконная функция.This example uses an aggregate window function as an argument for number.

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

Функции CAST и CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)