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

date의 지정된 datepart에 특정 number 간격(부호 있는 정수)이 추가된 date를 반환합니다.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

datepartdatepart
integernumber가 추가되는 date의 일부입니다.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.

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 mhh
minuteminute mi, nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

numbernumber
datedatepart에 추가된 int로 확인될 수 있는 식입니다.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
time, date, smalldatetime, datetime, datetime2 또는 datetimeoffset 값으로 확인할 수 있는 식입니다.Is an expression that can be resolved to a time, date, smalldatetime, datetime, datetime2, or datetimeoffset value. date는 식, 열 식, 사용자 정의 변수 또는 문자열 리터럴일 수 있습니다.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. 두 자리 연도에 대한 정보는 두 자리 연도 구분 구성 서버 구성 옵션을 참조하세요.For information about two-digit years, see Configure the two digit year cutoff Server Configuration Option.

반환 형식Return types

문자열 리터럴을 제외하고 반환 데이터 형식은 date 인수의 데이터 형식입니다.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, day, weekday는 동일한 값을 반환합니다.dayofyear, day, and weekday return the same value.

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

datepartmonth이고 date월의 일 수가 반환 월보다 많고 반환 월에 date일이 없을 경우 반환 월의 마지막 일이 반환됩니다.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, '20060830');
SELECT DATEADD(month, 1, '20060831');

number 인수number 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."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, '20060731');  
SELECT DATEADD(year,-2147483649, '20060731');  

date 인수date Argument

date 인수는 해당 데이터 형식 범위를 벗어나는 값으로 증가할 수 없습니다.The date argument cannot be incremented to a value outside the range of its data type. 다음 명령문에서는 date 값에 추가된 number 값이 date 데이터 형식의 범위를 초과합니다.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, '20060731');  
SELECT DATEADD(year,-2147483647, '20060731');  

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. datesmalldatetime인 경우 다음이 적용됩니다.If date is smalldatetime, the following apply:

  • datepartsecond이고 number가 -30 ~ +29 사이인 경우 추가가 수행되지 않습니다.If datepart is second and number is between -30 and +29, no addition is performed.
  • datepartsecond이고 number가 -30보다 작거나 +29보다 클 경우 1분부터 추가가 수행됩니다.If datepart is second and number is less than-30 or more than +29, addition is performed beginning at one minute.
  • datepartmillisecond이고 number가 -30001 ~ +29998 사이인 경우 추가가 수행되지 않습니다.If datepart is millisecond and number is between -30001 and +29998, no addition is performed.
  • datepartmillisecond이고 number가 -30001보다 작거나 +29998보다 클 경우 1분부터 추가가 수행됩니다.If datepart is millisecond and number is less than -30001 or more than +29998, addition is performed beginning at one minute.

RemarksRemarks

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

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

date 데이터 형식인 smalldatetime, date, datetime에는 microsecond 또는 nanoseconddatepart 추가가 허용되지 않습니다.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). time, datetime2, datetimeoffset 데이터 형식의 소수 자릿수는 7입니다(.1234567).The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). datepartnanosecond이며 date의 소수 자릿수는 number가 100이 된 이후 증가합니다.If datepart is nanosecond, number must be 100 before the fractional seconds of date increase. number가 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.

다음 명령문은 millisecond, microsecond 또는 nanoseconddatepart를 추가합니다.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

다음 각 명령문은 date에서 다음으로 높은 datepart도 증가시킬 수 있는 크기의 number만큼 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

다음 예에서는 여러 유형의 식을 numberdate 매개 변수에 대한 인수로 사용합니다.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

다음 예에서는 사용자 정의 변수를 numberdate에 대한 인수로 지정합니다.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

다음 예에서는 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)numberdate에 대한 인수로 사용합니다.The following 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) 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)를 numberdate에 대한 인수로 사용합니다.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

다음 예에서는 순위 함수를 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

다음 예에서는 집계 창 함수를 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)