다음을 통해 공유


DATEADD(Transact-SQL)

date의 지정된 datepart에 특정 number 간격(부호 있는 정수)이 추가된 date를 반환합니다.

모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수(Transact-SQL)를 참조하십시오. 날짜/시간 데이터 형식 및 함수에 대한 자세한 내용과 일반적인 예는 날짜 및 시간 데이터 사용을 참조하십시오.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

DATEADD (datepart , number, date )

인수

  • datepart
    integernumber가 추가되는 date 부분입니다. 다음 표에서는 올바른 모든 datepart 인수를 보여 줍니다. 해당하는 사용자 정의 변수는 사용할 수 없습니다.

    datepart

    약어

    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
    date의 datepart에 추가된 int로 확인될 수 있는 식입니다. 사용자 정의 변수는 유효합니다.

    소수점 이하가 포함된 값을 지정할 경우 소수점 이하는 반올림되지 않고 잘립니다.

  • date
    time, date, smalldatetime, datetime, datetime2 또는 datetimeoffset 값으로 확인될 수 있는 식입니다. date는 식, 열 식, 사용자 정의 변수 또는 문자열 리터럴일 수 있습니다. 식이 문자열 리터럴인 경우 datetime으로 확인되어야 합니다. 모호성을 피하려면 4자리 연도를 사용하십시오. 2자리 연도에 대한 자세한 내용은 two digit year cutoff 옵션을 참조하십시오.

반환 형식

문자열 리터럴을 제외하고 반환 데이터 형식은 date 인수의 데이터 형식입니다.

문자열 리터럴의 반환 데이터 형식은 datetime입니다. 문자열 리터럴 초의 소수 자릿수가 세 자리(.nnn)를 초과하거나 표준 시간대 오프셋 부분을 포함할 경우 오류가 발생합니다.

[!참고]

문자열 리터럴이 date 매개 변수에 대해 명시적으로 캐스팅되지 않는 경우 DATEADD를 다른 날짜/시간 함수와 함께 사용할 때 일-월-년(mdy) 날짜 형식을 사용하는 로캘이 잘못된 결과를 받을 수 있습니다.

datetime2 유형 반환

date 매개 변수가 datetime2 유형이면 DATEADD는 datetime2 유형을 반환합니다. date 매개 변수에 대해 문자열 리터럴을 사용할 때는 DATEADD에서 datetime2 유형을 반환하도록 리터럴을 datetime2 유형에 명시적으로 캐스팅해야 합니다.

반환 값

datepart 인수

dayofyear, day 및 weekday는 같은 값을 반환합니다.

각 datepart와 해당 약어는 동일한 값을 반환합니다.

datepart가 month이고 date 월의 일 수가 반환 월보다 많고 반환 월에 date 일이 없을 경우 반환 월의 마지막 일이 반환됩니다. 예를 들어 9월에는 30일이 있으므로 다음 두 가지 문은 2006-09-30 00:00:00.000을 반환합니다.

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

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

number 인수

number 인수는 int 범위를 초과할 수 없습니다. 다음 문에서 number에 대한 인수는 int 범위를 1만큼 초과합니다. 이 경우 "식을(를) 데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다."라는 오류 메시지를 반환합니다.

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

date 인수

date 인수는 해당 데이터 형식 범위를 벗어나는 값으로 증가할 수 없습니다. 다음 문에서는 date 값에 추가된 number 값이 date 데이터 형식의 범위를 초과합니다. 이 경우 "'datetime' 열에 값을 추가하는 중 오버플로가 발생했습니다."라는 오류 메시지를 반환합니다.

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

smalldatetime 날짜, 초 또는 소수 자릿수 초 datepart에 대한 반환 값

smalldatetime 값의 초 부분은 항상 00입니다. date가 smalldatetime일 경우 다음이 적용됩니다.

  • datepart가 second이고 number가 -30에서 +29 사이일 경우 추가되지 않습니다.

  • datepart가 second이고 number가 -30보다 작거나 +29보다 클 경우 1분부터 추가됩니다.

  • datepart가 millisecond이고 number가 -30001에서 +29998 사이일 경우 추가되지 않습니다.

  • datepart가 millisecond이고 number가 -30001보다 작거나 +29998보다 클 경우 1분부터 추가됩니다.

주의

DATEADD는 SELECT <목록>, WHERE, HAVING, GROUP BY 및 ORDER BY 절에서 사용할 수 있습니다.

소수 자릿수 초의 전체 자릿수

date 데이터 형식 smalldatetime, date 및 datetime에 대한 microsecond 또는 nanosecond의 datepart 추가는 허용되지 않습니다.

밀리초의 소수 자릿수는 세 자리이며(.123), 마이크로초는 6자리(.123456), 나노초는 9자리(.123456789)입니다. time, datetime2 및 datetimeoffset 데이터 형식의 최대 소수 자릿수는 7자리입니다(.1234567). datepart가 nanosecond일 경우 date의 소수 자릿수 초가 증가하려면 number가 100이어야 합니다. number가 1에서 49 사이일 경우 0으로 버려지며 50에서 99 사이일 경우 100으로 반올림됩니다.

다음 문에서는 millisecond, microsecond 또는 nanosecond의 datepart를 추가합니다.

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
*/

표준 시간대 오프셋

표준 시간대 오프셋에 대한 추가는 허용되지 않습니다.

1. 1씩 datepart 증가

다음 각 문은 datepart를 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
*/

2. 하나의 문에서 datepart를 두 수준 이상 증가

다음 각 문은 datepart를 number만큼 증가시키며 이로 인해 date에서 한 수준 높은 datepart도 증가하게 됩니다.

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. 식을 숫자 및 날짜 매개 변수에 대한 인수로 사용

다음 예에서는 여러 유형의 식을 number 및 date 매개 변수에 대한 인수로 사용합니다.

열을 날짜로 지정

다음 예에서는 각 OrderDate에 2일을 추가하여 새 PromisedShipDate를 계산합니다.

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

사용자 정의 변수를 숫자 및 날짜로 지정

다음 예에서는 사용자 정의 변수를 number 및 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);

스칼라 시스템 함수를 날짜로 지정

다음 예에서는 date에 대한 SYSDATETIME을 지정합니다.

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

스칼라 하위 쿼리 및 스칼라 함수를 숫자 및 날짜로 지정

다음 예에서는 스칼라 하위 쿼리 및 스칼라 함수MAX(ModifiedDate)를 number 및 date에 대한 인수로 사용합니다. (SELECT TOP 1 ContactID FROM Person.Contact)는 값 목록에서 number 인수를 선택하는 방법을 보여 주기 위하여 만든 숫자 매개 변수에 대한 인수입니다.

USE AdventureWorks;
GO
SELECT DATEADD(month,(SELECT TOP 1 ContactID FROM Person.Contact),
    (SELECT MAX(ModifiedDate) FROM Person.Contact));

상수를 숫자 및 날짜로 지정

다음 예에서는 숫자 및 문자 상수를 number 및 date에 대한 인수로 사용합니다.

SELECT DATEADD(minute, 1, '2007-05-07 09:53:01.0376635');

숫자 식 및 스칼라 시스템 함수를 숫자 및 날짜로 지정

다음 예에서는 숫자 식(-(10/2)), 단항 연산자(-), 산술 연산자(/), 스칼라 시스템 함수(SYSDATETIME)를 number 및 date에 대한 인수로 사용합니다.

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

순위 함수를 숫자로 지정

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

집계 창 함수를 숫자로 지정

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

4. dmy 날짜 형식을 사용하는 로캘에 대해 DATEADD 사용

다음 예에서는 일부 로캘에 대해 문자열 리터럴에 DATEADD를 사용하는 방법을 보여 줍니다.

암시적 문자열 리터럴 캐스팅 사용 시의 문제점 설명

다음 예에서는 문자열 리터럴을 명시적으로 캐스팅하지 않는 경우 발생하는 현상을 보여 줍니다.

SET LANGUAGE Español;

GO

SELECT DATENAME(m, DATEADD(d, 0,'1987-03-07'));

SELECT DATENAME(m, '1987-03-07');

GO

첫 번째 SELECT 문은 월에 대해 julio(7월)를 반환하고 두 번째 SELECT 문은 월에 대해 marzo(3월)를 반환합니다.

문자열 리터럴을 명시적으로 캐스팅하여 결과 오류 방지

다음 예에서는 date 매개 변수를 명시적으로 캐스팅하여 결과의 오류를 방지하는 방법을 보여 줍니다.

SET LANGUAGE Español;

GO

SELECT DATENAME(m, DATEADD(d, 0, CAST('1987-03-07' AS datetime2)));

SELECT DATENAME(m, '1987-03-07');

GO

두 SELECT 문에서 모두 월에 대해 marzo(3월)를 반환합니다.

문자열 리터럴 대신 datetime2 변수 사용

다음 예에서는 문자열 리터럴을 직접 사용하지 않고 datetime2 변수를 사용합니다.

SET LANGUAGE Español;

GO

DECLARE @d datetime2 = '1987-03-07';

SELECT DATENAME(m, DATEADD(d, 0, @d));

SELECT DATENAME(m, @d);

GO

참고 항목

참조