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

이 항목은 다음에 적용됩니다. 예SQL Server(2008부터)예Azure SQL Database예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

지정 된 반환 날짜 지정 된 번호 간격 (부호 있는 정수)에 지정 된 추가 datepart 해당 날짜합니다.Returns a specified date with the specified number interval (signed integer) added to a specified datepart of that date.

모든 개요 Transact-SQLTransact-SQL 날짜 및 시간 데이터 형식 및 함수, 참조 날짜 및 시간 데이터 형식 및 함수 ( Transact SQL ) .For an overview of all Transact-SQLTransact-SQL date and time data types and functions, see Date and Time Data Types and Functions (Transact-SQL).

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

DATEADD (datepart , number , date )  

인수Arguments

날짜 부분datepart
일부인 날짜 입니다는 정수번호 추가 됩니다.Is the part of date to which an integernumber is added. 다음 표에서 모든 유효한 datepart 인수입니다.The following table lists all valid datepart arguments. 해당하는 사용자 정의 변수는 사용할 수 없습니다.User-defined variable equivalents are not valid.

날짜 부분datepart 약어Abbreviations
연도year yy, yyyyyy, yyyy
분기quarter qq, qqq, q
month mm, mmm, m
dayofyeardayofyear dy, ydy, y
day dd, ddd, d
week wk, wwwk, ww
요일weekday dw, wdw, w
1 시간hour mhh
minute mi,nmi, n
두 번째second ss, sss, s
밀리초millisecond msms
(마이크로초)microsecond mcsmcs
나노초nanosecond nsns

numbernumber
식으로 확인 될 수 있는 프로그램 int 에 추가 되는 datepart날짜합니다.Is an expression that can be resolved to an int that is added to a datepart of date. 사용자 정의 변수는 유효합니다.User-defined variables are valid.
소수점 이하가 포함된 값을 지정할 경우 소수점 이하는 반올림되지 않고 잘립니다.If you specify a value with a decimal fraction, the fraction is truncated and not rounded.

datedate
식으로 확인 될 수 있는 한 시간, 날짜, smalldatetime, datetime, datetime2, 또는 datetimeoffset 값입니다.Is an expression that can be resolved to a time, date, smalldatetime, datetime, datetime2, or datetimeoffset value. 날짜 식, 열 식, 사용자 정의 변수 또는 문자열 리터럴일 수 있습니다.date can be an expression, column expression, user-defined variable, or string literal. 식이 문자열 리터럴을 이면으로 확인 되어야는 datetime합니다.If the expression is a string literal, it must resolve to a datetime. 모호성을 피하려면 4자리 연도를 사용하세요.To avoid ambiguity, use four-digit years. 에 대 한 정보에 대 한 두 자리 연도 참조 두 자리 연도 구성 cutoff 서버 구성 옵션합니다.For information about two-digit years, see Configure the two digit year cutoff Server Configuration Option.

반환 형식Return types

반환 데이터 형식은 변수의 데이터 형식을 날짜 인수 문자열 리터럴 제외 하 고 있습니다.The return data type is the data type of the date argument, except for string literals. 문자열 리터럴은 반환 데이터 형식은 datetime합니다.The return data type for a string literal is datetime. 문자열 리터럴 초의 소수 자릿수가 세 자리(.nnn)를 초과하거나 표준 시간대 오프셋 부분을 포함할 경우 오류가 발생합니다.An 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

datepart 인수datepart Argument

dayofyear, , 및 평일 동일한 값을 반환 합니다.dayofyear, day, and weekday return the same value.

datepart 해당 약어는 동일한 값을 반환 합니다.Each datepart and its abbreviations return the same value.

경우 datepart날짜 달은 반환 월 보다 더 많은 날짜 및 날짜 일 반환 월에 없습니다. 반환 월의 마지막 날이 반환 됩니다.If datepart is month and the date month has more days than the return month and the date day does not exist in the return month, the last day of the return month is returned. 예를 들어 9월에는 30일이 있으므로 다음 두 가지 문은 2006-09-30 00:00:00.000을 반환합니다.For example, September has 30 days; therefore, the two following statements return 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '2006-08-30');
SELECT DATEADD(month, 1, '2006-08-31');

number 인수number Argument

번호 인수의 범위를 초과할 수 없습니다 int합니다. 다음 문에서 인수에 대 한 번호 의 범위를 초과 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."The following error message is returned: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

SELECT DATEADD(year,2147483648, '2006-07-31');  
SELECT DATEADD(year,-2147483649, '2006-07-31');  

date 인수date Argument

날짜 인수는 해당 데이터 형식의 범위를 벗어난 값으로 증가할 수 없습니다.The date argument cannot be incremented to a value outside the range of its data type. 다음 문에서 번호 값에 추가 되는 날짜 값의 범위를 초과 날짜 데이터 형식입니다.In the following statements, the number value that is added to the date value exceeds the range of the date data type. 다음과 같은 오류 메시지가 반환 됩니다: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."The following error message is returned: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."

SELECT DATEADD(year,2147483647, '2006-07-31');  
SELECT DATEADD(year,-2147483647, '2006-07-31');  

smalldatetime 날짜, 초 또는 소수 자릿수 초 datepart에 대한 반환 값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. 경우 날짜smalldatetime, 다음에 해당 합니다.If date is smalldatetime, the following apply:

  • 경우 datepart두 번째번호 가-30 사이의 + 29, 추가 되지 않습니다.If datepart is second and number is between -30 and +29, no addition is performed.
  • 경우 datepart두 번째번호 작은 보다 30 또는 + 29 개 이상의 추가 1 분부터 수행 됩니다.If datepart is second and number is less than-30 or more than +29, addition is performed beginning at one minute.
  • 경우 datepart밀리초번호 범위에 속함-30001에서 + 29998, 추가 되지 않습니다.If datepart is millisecond and number is between -30001 and +29998, no addition is performed.
  • 경우 datepart밀리초번호 + 29998 보다 또는-30001 보다 작거나, 1 분부터 추가 수행 됩니다.If datepart is millisecond and number is less than -30001 or more than +29998, addition is performed beginning at one minute.

주의Remarks

DATEADD는 SELECT에서 사용할 수 있습니다 <목록 >, 여기서 HAVING, GROUP BY 및 ORDER BY 절.DATEADD can be used in the SELECT <list>, WHERE, HAVING, GROUP BY and ORDER BY clauses.

소수 자릿수 초의 전체 자릿수Fractional seconds precision

에 대 한 추가 datepart마이크로초 또는 나노초 에 대 한 날짜 데이터 형식 smalldatetime, 날짜, 및 datetime 허용 되지 않습니다.Addition for a datepart of microsecond or nanosecond for date data types smalldatetime, date, and datetime is not allowed.

밀리초의 소수 자릿수는 세 자리이며(.123) 마이크로초는 6자리(.123456), 나노초는 9자리(.123456789)입니다.Milliseconds have a scale of 3 (.123), microseconds have a scale of 6 (.123456), And nanoseconds have a scale of 9 (.123456789). 시간, datetime2, 및 datetimeoffset 데이터 형식에는 최대 자릿수는 7 (. 1234567).The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). 경우 datepart나노초, 번호 의 소수 자릿수 초 전에 100 해야 날짜 증가 합니다.If datepart is nanosecond, number must be 100 before the fractional seconds of date increase. A 번호 1에서 49 사이 0에서 50에서 99 까지의 숫자로 반내림 됩니다는 100으로 합니다.A number between 1 and 49 is rounded down to 0 and a number from 50 to 99 is rounded up to 100.

다음 문을 추가 datepart밀리초, 마이크로초, 또는 나노초합니다.The following 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

표준 시간대 오프셋에 대한 추가는 허용되지 않습니다.Addition is not allowed for time zone offset.

Examples

1.A. 1씩 datepart 증가Incrementing datepart by an interval of 1

다음 문은 간격의 각 datepart 1 씩 합니다.Each of the following 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  

2.B. 하나의 문에서 datepart를 두 수준 이상 증가Incrementing more than one level of datepart in one statement

다음 문은 간격의 각 datepart 여는 번호 도 증가 수 있을 만큼 큰 높은 datepart날짜.Each of the following statements increments datepart by a number large enough to also 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.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  

3.C. 식을 숫자 및 날짜 매개 변수에 대한 인수로 사용Using expressions as arguments for the number and date parameters

다음 예에서는 다양 한 유형의 식에 대 한 인수로 사용 하 여는 번호날짜 매개 변수입니다.The following examples use different types of expressions as arguments for the number and date parameters. 예제에서는 AdventureWorks 데이터베이스를 사용 합니다.The examples use the AdventureWorks database.

열을 날짜로 지정Specifying a column as date

다음 예제에서는 2 일수를 OrderDate 열의 각 값에 추가하여 이름이 PromisedShipDate인 새 열을 파생시킵니다.The following example adds 2 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;  

다음은 결과 집합의 일부입니다.Here is 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  

사용자 정의 변수를 숫자 및 날짜로 지정Specifying user-defined variables as number and date

다음 예제에 대 한 인수로 사용자 정의 변수 지정 번호날짜합니다.The following 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)  

스칼라 시스템 함수를 날짜로 지정Specifying scalar system function as date

다음 예에서는 지정 SYSDATETIME 에 대 한 날짜합니다.The following example specifies SYSDATETIME for date.

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

결과 집합은 다음과 같습니다.Here is the result set.

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

(1 row(s) affected)  

스칼라 하위 쿼리 및 스칼라 함수를 숫자 및 날짜로 지정Specifying scalar subqueries and scalar functions as number and date

다음 예에서는 스칼라 하위 쿼리를 사용 하 여 MAX(ModifiedDate)에 대 한 인수로 번호날짜합니다.The following example uses scalar subqueries, MAX(ModifiedDate), as arguments for number and date. (SELECT TOP 1 BusinessEntityID FROM Person.Person)선택 하는 방법을 보여 주는 숫자 매개 변수에 대 한 인공 인수로 번호 값 목록에서 인수입니다.(SELECT TOP 1 BusinessEntityID FROM Person.Person) is 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));  

숫자 식 및 스칼라 시스템 함수를 숫자 및 날짜로 지정Specifying numeric expressions and scalar system functions as number and date

다음 예제에서는 숫자 식 (-(10/2)), 단항 연산자 (-), 산술 연산자 (/), 스칼라 시스템 함수 (SYSDATETIME)에 대 한 인수로 번호날짜합니다.The following 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());  

순위 함수를 숫자로 지정Specifying ranking functions as number

다음 예에서는 순위 함수에 대 한 인수로 사용 하 여 번호합니다.The following example uses a ranking function as arguments 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;  

집계 창 함수를 숫자로 지정Specifying an aggregate window function as number

다음 예제에서는 집계 창 함수를 사용 하 여에 대 한 인수로 서 번호합니다.The following 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)