DATEADD(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 Warehouse

이 함수는 입력 datedatepartnumber(부호 있는 정수)를 추가하고 수정된 날짜/시간 값을 반환합니다. 예를 들어 이 함수를 사용하여 오늘 부터 7,000분인 날짜( number = 7000, datepart = minute, date = today)를 찾을 수 있습니다.

모든 Transact-SQL 날짜 및 시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수를 참조하세요.

Transact-SQL 구문 표기 규칙

Syntax

DATEADD (datepart , number , date )

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

datepart

int숫자를 추가하는 날짜DATEADD부분입니다. 이 표에서는 올바른 datepart 인수가 모두 나열되어 있습니다.

참고 항목

DATEADD에서는 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

DATEADDdatedatepart에 추가하는 int를 확인할 수 있는 식입니다. DATEADDnumber에 대한 사용자 정의 변수 값을 허용합니다. DATEADD 소수 자릿수가 있는 지정된 숫자 값을 자립니다. 이 상황에서는 숫자 값을 반올림하지 않습니다.

date

다음 값 중 하나를 확인할 수 있는 식입니다.

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

날짜DATEADD 경우 열 식, 식, 문자열 리터럴 또는 사용자 정의 변수를 허용합니다. 문자열 리터럴 값은 datetime을 확인해야 합니다. 모호성 문제를 피하려면 4자리 연도를 사용하세요. 두 자리 연도에 대한 자세한 내용은 두 자리 연도 구분(서버 구성 옵션) 구성을 참조하세요.

반환 형식

이 메서드의 반환 값 데이터 형식은 동적입니다. 반환 형식은 date에 제공된 인수의 따라 달라집니다. date의 값이 문자열 리터럴 날짜인 경우 DATEADDdatetime 값을 반환합니다. date에 대해 다른 유효한 입력 데이터 형식이 제공되면 DATEADD가 동일한 데이터 형식을 반환합니다. 문자열 리터럴 초 소수 자릿수가 세 자릿수(.nnn)를 초과하거나 문자열 리터럴이 표준 시간대 오프셋 부분을 포함하는 경우 DATEADD는 오류를 발생합니다.

반환 값

datepart 인수

dayofyear, dayweekday 동일한 값을 반환합니다.

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

다음이 사실인 경우:

  • datepart is month
  • date 월에는 반환 월보다 더 많은 날이 있음
  • 반환 월에 날짜 날짜가 없습니다.

그런 다음, DATEADD은 반환 월의 마지막 날을 반환합니다. 예를 들어 9월은 30일(30일)입니다. 따라서 이러한 문은 다음을 반환 2024-09-30 00:00:00.000합니다.

SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');

number 인수

숫자 인수는 int 범위를 초과할 수 없습니다. 다음 문에서 숫자 인수는 int범위를 1로 초과합니다. 이러한 문은 모두 다음 오류 메시지를 반환합니다. Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.

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

date 인수

DATEADD에서는 데이터 형식 범위를 벗어난 값으로 증분된 날짜 인수를 허용하지 않습니다. 다음 명령문에서는 date 값에 추가된 number 값이 date 데이터 형식의 범위를 초과합니다. DATEADD 는 다음 오류 메시지를 반환합니다. Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.

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

smalldatetime 날짜 및 초 또는 소수 자릿수 초 datepart의 값을 반환합니다.

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

  • datepartsecond경우 -30에서 +29 DATEADD 사이의 숫자 값은 변경하지 않습니다.

  • datepartsecond숫자 값이 -30보다 작거나 +29 DATEADD 보다 큰 경우 1분부터 추가를 수행합니다.

  • -30001에서 +29998 DATEADD 사이의 datepartmillisecond숫자 값의 경우 변경하지 않습니다.

  • datepartmillisecond숫자 값이 -30001보다 작거나 +29998 DATEADD 보다 큰 경우 1분부터 추가를 수행합니다.

설명

다음 절에서 DATEADD를 사용합니다.

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

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

DATEADD는 날짜 데이터 형식 smalldatetime, date 및 datetimemicrosecond datepart 또는 nanosecond추가를 허용하지 않습니다.

밀리초의 소수 자릿수는 3이고.123, 마이크로초의 배율은 6이고,.123456 나노초는 9(.123456789)의 배율을 갖습니다. 시간, datetime2datetimeoffset 데이터 형식의 최대 배율은 7(.1234567)입니다. datepart의 경우 날짜의 nanosecond소수 자릿수 초가 증가하기 전에 숫자는 100이어야 합니다. 1에서 49 사이의 숫자는 0으로 반올림되고 50에서 99 사이의 숫자는 100으로 반올림됩니다.

이러한 문은 datepartmillisecond추가microsecondnanosecond합니다.

DECLARE @datetime2 DATETIME2 = '2024-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);

결과 집합은 다음과 같습니다.

1 millisecond     2024-01-01 13:10:10.1121111
2 milliseconds    2024-01-01 13:10:10.1131111
1 microsecond     2024-01-01 13:10:10.1111121
2 microseconds    2024-01-01 13:10:10.1111131
49 nanoseconds    2024-01-01 13:10:10.1111111
50 nanoseconds    2024-01-01 13:10:10.1111112
150 nanoseconds   2024-01-01 13:10:10.1111113

표준 시간대 오프셋

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

예제

A. datepart를 1 간격으로 증분

이러한 각 명령문은 datepart를 1씩 증가시킵니다.

DECLARE @datetime2 DATETIME2 = '2024-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         2025-01-01 13:10:10.1111111
quarter      2024-04-01 13:10:10.1111111
month        2024-02-01 13:10:10.1111111
dayofyear    2024-01-02 13:10:10.1111111
day          2024-01-02 13:10:10.1111111
week         2024-01-08 13:10:10.1111111
weekday      2024-01-02 13:10:10.1111111
hour         2024-01-01 14:10:10.1111111
minute       2024-01-01 13:11:10.1111111
second       2024-01-01 13:10:11.1111111
millisecond  2024-01-01 13:10:10.1121111
microsecond  2024-01-01 13:10:10.1111121
nanosecond   2024-01-01 13:10:10.1111111

B. 한 문에서 둘 이상의 datepart 수준 증가

이러한 각 명령문은 date에서 다음으로 높은 datepart를 추가적으로 증가시킬 수 있는 크기의 number만큼 datepart를 증가시킵니다.

DECLARE @datetime2 DATETIME2;

SET @datetime2 = '2024-01-01 01:01:01.1111111';

--Statement                                 Result
-------------------------------------------------------------------
SELECT DATEADD(quarter, 4, @datetime2);     --2025-01-01 01:01:01.1111111
SELECT DATEADD(month, 13, @datetime2);      --2025-02-01 01:01:01.1111111
SELECT DATEADD(dayofyear, 365, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(day, 365, @datetime2);       --2025-01-01 01:01:01.1111111
SELECT DATEADD(week, 5, @datetime2);        --2024-02-05 01:01:01.1111111
SELECT DATEADD(weekday, 31, @datetime2);    --2024-02-01 01:01:01.1111111
SELECT DATEADD(hour, 23, @datetime2);       --2024-01-02 00:01:01.1111111
SELECT DATEADD(minute, 59, @datetime2);     --2024-01-01 02:00:01.1111111
SELECT DATEADD(second, 59, @datetime2);     --2024-01-01 01:02:00.1111111
SELECT DATEADD(millisecond, 1, @datetime2); --2024-01-01 01:01:01.1121111

C. 식을 숫자 및 날짜 매개 변수에 대한 인수로 사용

이러한 예제에서는 여러 유형의 식을 numberdate 매개 변수에 대한 인수로 사용합니다. 예제는 AdventureWorks 데이터베이스를 사용합니다.

열을 날짜로 지정

이 예제에서는 2(2) 일수를 OrderDate 열의 각 값에 추가하여 PromisedShipDate라는 새 열을 파생시킵니다.

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

다음은 부분 결과 집합입니다.

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

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

이 예제에서는 사용자 정의 변수를 numberdate에 대한 인수로 지정합니다.

DECLARE @days INT = 365,
    @datetime DATETIME = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;

SELECT DATEADD(day, @days, @datetime);

결과 집합은 다음과 같습니다.

2000-12-31 01:01:01.110

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

이 예제에서는 date에 대해 SYSDATETIME을 지정합니다. 반환되는 정확한 값은 명령문 실행의 날짜와 시간에 따라 달라집니다.

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

결과 집합은 다음과 같습니다.

2024-04-25 14:29:59.6727944

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

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

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

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

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

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

순위 함수를 숫자로 지정

이 예제에서는 순위 함수를 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 인수로 사용합니다.

SELECT SalesOrderID,
    ProductID,
    OrderQty,
    DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO