DATEADD(Transact-SQL)
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
이 함수는 입력 date의 datepart에 number(부호 있는 정수)를 추가하고 수정된 날짜/시간 값을 반환합니다. 예를 들어 이 함수를 사용하여 오늘 부터 7,000분인 날짜( number = 7000, datepart = minute, date = today)를 찾을 수 있습니다.
모든 Transact-SQL 날짜 및 시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수를 참조하세요.
구문
DATEADD (datepart , number , date )
인수
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
DATEADD
은 date의 datepart에 추가하는 int를 확인할 수 있는 식입니다. DATEADD
은 number에 대한 사용자 정의 변수 값을 허용합니다. DATEADD
소수 자릿수가 있는 지정된 숫자 값을 자립니다. 이 상황에서는 숫자 값을 반올림하지 않습니다.
date
다음 값 중 하나를 확인할 수 있는 식입니다.
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
날짜의 DATEADD
경우 열 식, 식, 문자열 리터럴 또는 사용자 정의 변수를 허용합니다. 문자열 리터럴 값은 datetime을 확인해야 합니다. 모호성 문제를 피하려면 4자리 연도를 사용하세요. 두 자리 연도에 대한 자세한 내용은 두 자리 연도 구분(서버 구성 옵션) 구성을 참조하세요.
반환 형식
이 메서드의 반환 값 데이터 형식은 동적입니다. 반환 형식은 date
에 제공된 인수의 따라 달라집니다. date
의 값이 문자열 리터럴 날짜인 경우 DATEADD
가 datetime 값을 반환합니다. date
에 대해 다른 유효한 입력 데이터 형식이 제공되면 DATEADD
가 동일한 데이터 형식을 반환합니다. 문자열 리터럴 초 소수 자릿수가 세 자릿수(.nnn)를 초과하거나 문자열 리터럴이 표준 시간대 오프셋 부분을 포함하는 경우 DATEADD
는 오류를 발생합니다.
반환 값
datepart 인수
dayofyear
, day
및 weekday
동일한 값을 반환합니다.
각 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입니다. smalldatetime 날짜 값의 경우 다음이 적용됩니다.
datepart의
second
경우 -30에서 +29DATEADD
사이의 숫자 값은 변경하지 않습니다.datepart 및
second
숫자 값이 -30보다 작거나 +29DATEADD
보다 큰 경우 1분부터 추가를 수행합니다.-30001에서 +29998
DATEADD
사이의 datepartmillisecond
및 숫자 값의 경우 변경하지 않습니다.datepart 및
millisecond
숫자 값이 -30001보다 작거나 +29998DATEADD
보다 큰 경우 1분부터 추가를 수행합니다.
설명
다음 절에서 DATEADD
를 사용합니다.
GROUP BY
HAVING
ORDER BY
SELECT <list>
WHERE
소수 자릿수 초의 전체 자릿수
DATEADD
는 날짜 데이터 형식 smalldatetime, date 및 datetime의 microsecond
datepart 또는 nanosecond
추가를 허용하지 않습니다.
밀리초의 소수 자릿수는 3이고.123
, 마이크로초의 배율은 6이고,.123456
나노초는 9(.123456789
)의 배율을 갖습니다. 시간, datetime2 및 datetimeoffset 데이터 형식의 최대 배율은 7(.1234567
)입니다. datepart의 경우 날짜의 nanosecond
소수 자릿수 초가 증가하기 전에 숫자는 100이어야 합니다. 1에서 49 사이의 숫자는 0으로 반올림되고 50에서 99 사이의 숫자는 100으로 반올림됩니다.
이러한 문은 datepart를 millisecond
추가microsecond
nanosecond
합니다.
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, 366, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(day, 366, @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. 식을 숫자 및 날짜 매개 변수에 대한 인수로 사용
이러한 예제에서는 여러 유형의 식을 number 및 date 매개 변수에 대한 인수로 사용합니다. 예제는 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
사용자 정의 변수를 숫자 및 날짜로 지정
이 예제에서는 사용자 정의 변수를 number 및 date에 대한 인수로 지정합니다.
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)
를 number 및 date에 대한 인수로 사용합니다. (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