DATETRUNC(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft FabricWarehouse에 있는 SQL Server 2022(16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL 분석 엔드포인트
함수는 DATETRUNC
지정된 datepart로 잘린 입력 날짜를 반환합니다.
구문
DATETRUNC ( datepart, date )
인수
datepart
잘림의 정밀도를 지정합니다. 이 표에는 입력 날짜 형식의 유효한 부분이기도 한 DATETRUNC
에 대한 모든 유효한 datepart 값이 나열됩니다.
datepart | 약어 | 잘림 메모 |
---|---|---|
year | yy, yyyy | |
quarter | qq, q | |
month | mm, m | |
dayofyear | dy, y | dayofyear는 day와 동일한 방식으로 잘립니다. |
day | dd, d | day는 dayofyear과 동일한 방식으로 잘립니다. |
week | wk, ww | 주의 첫 번째 요일을 자릅니다. T-SQL에서 주의 첫 번째 요일은 @@DATEFIRST T-SQL 설정에 의해 정의됩니다. 미국의 경우 영어 환경은 @@DATEFIRST 의 기본값을 7(일요일)로 설정합니다. |
iso_week | isowk, isoww | ISO 주의 첫 번째 요일을 자릅니다. ISO8601 일정 시스템에서 주의 첫 번째 요일은 월요일입니다. |
hour | hh | |
minute | mi, n | |
second | ss, s | |
millisecond | ms | |
microsecond | mcs |
참고 항목
DATETRUNC
에는 weekday, timezoneoffset 및 nanosecond T-SQL 날짜 파트가 지원되지 않습니다.
date
유효한 T-SQL 날짜 또는 시간 형식으로 확인할 수 있는 식, 열 또는 사용자 정의 변수를 허용합니다. 유효한 유형은 다음과 같습니다.
- smalldatetime
- 날짜/시간
- date
- time
- datetime2
- datetimeoffset
date 매개 변수를 date 데이터 형식과 혼동하지 마세요.
또한 DATETRUNC
는 datetime2(7)로 확인할 수 있는 문자열 리터럴(모든 문자열 형식)을 허용합니다.
반환 형식
DATETRUNC
에 대해 반환된 데이터 형식은 동적입니다. DATETRUNC
는 입력 날짜와 동일한 데이터 형식(및 해당하는 경우 동일한 소수 시간 배율)의 잘린 날짜를 반환합니다. 예를 들어 DATETRUNC
에 datetimeoffset(3) 입력 날짜가 지정된 경우 datetimeoffset(3)을 반환합니다. datetime2(7)로 확인할 수 있는 문자열 리터럴이 제공된 경우 DATETRUNC
는 datetime2(7)를 반환합니다.
소수 시간 배율 정밀도
밀리초의 소수 시간 배율은 3(.123
)이고, 마이크로초의 소수 시간 배율은 6(.123456
)이고, 나노초의 소수 시간 배율은 9(.123456789
)입니다. time, datetime2, datetimeoffset 데이터 형식은 최대 소수 시간 배율 7(.1234567
)을 허용합니다. 따라서 millisecond
datepart로 자르려면 소수 시간 배율이 3 이상이어야 합니다. 마찬가지로 microsecond
datepart로 자르려면 시간 배율이 6 이상이어야 합니다. T-SQL 날짜 형식이 소수 시간 배율 9를 지원하지 않으므로 DATETRUNC
는 nanosecond
datepart를 지원하지 않습니다.
예제
A. 다른 datepart 옵션 사용
다음 예제에서는 다양한 datepart 옵션 사용을 보여줍니다.
DECLARE @d datetime2 = '2021-12-08 11:30:15.1234567';
SELECT 'Year', DATETRUNC(year, @d);
SELECT 'Quarter', DATETRUNC(quarter, @d);
SELECT 'Month', DATETRUNC(month, @d);
SELECT 'Week', DATETRUNC(week, @d); -- Using the default DATEFIRST setting value of 7 (U.S. English)
SELECT 'Iso_week', DATETRUNC(iso_week, @d);
SELECT 'DayOfYear', DATETRUNC(dayofyear, @d);
SELECT 'Day', DATETRUNC(day, @d);
SELECT 'Hour', DATETRUNC(hour, @d);
SELECT 'Minute', DATETRUNC(minute, @d);
SELECT 'Second', DATETRUNC(second, @d);
SELECT 'Millisecond', DATETRUNC(millisecond, @d);
SELECT 'Microsecond', DATETRUNC(microsecond, @d);
결과 세트:
Year 2021-01-01 00:00:00.0000000
Quarter 2021-10-01 00:00:00.0000000
Month 2021-12-01 00:00:00.0000000
Week 2021-12-05 00:00:00.0000000
Iso_week 2021-12-06 00:00:00.0000000
DayOfYear 2021-12-08 00:00:00.0000000
Day 2021-12-08 00:00:00.0000000
Hour 2021-12-08 11:00:00.0000000
Minute 2021-12-08 11:30:00.0000000
Second 2021-12-08 11:30:15.0000000
Millisecond 2021-12-08 11:30:15.1230000
Microsecond 2021-12-08 11:30:15.1234560
B. @@DATEFIRST 설정
다음 예제에서는 week
datepart와 함께 @@DATEFIRST
설정 사용 방법을 보여줍니다.
DECLARE @d datetime2 = '2021-11-11 11:11:11.1234567';
SELECT 'Week-7', DATETRUNC(week, @d); -- Uses the default DATEFIRST setting value of 7 (U.S. English)
SET DATEFIRST 6;
SELECT 'Week-6', DATETRUNC(week, @d);
SET DATEFIRST 3;
SELECT 'Week-3', DATETRUNC(week, @d);
결과 세트:
Week-7 2021-11-07 00:00:00.0000000
Week-6 2021-11-06 00:00:00.0000000
Week-3 2021-11-10 00:00:00.0000000
C. 날짜 리터럴
다음 예제에서는 date 매개 변수 리터럴 사용 방법을 보여줍니다.
SELECT DATETRUNC(month, '1998-03-04');
SELECT DATETRUNC(millisecond, '1998-03-04 10:10:05.1234567');
DECLARE @d1 char(200) = '1998-03-04';
SELECT DATETRUNC(millisecond, @d1);
DECLARE @d2 nvarchar(max) = '1998-03-04 10:10:05';
SELECT DATETRUNC(minute, @d2);
결과 집합은 다음과 같습니다(모든 결과는 datetime2(7) 형식임).
1998-03-01 00:00:00.0000000
1998-03-04 10:10:05.1230000
1998-03-04 00:00:00.0000000
1998-03-04 10:10:00.0000000
D. 변수 및 date 매개 변수
다음 예제에서는 date 매개 변수 사용 방법을 보여줍니다.
DECLARE @d datetime2 = '1998-12-11 02:03:04.1234567';
SELECT DATETRUNC(day, @d);
결과:
1998-12-11 00:00:00.0000000
E. 열 및 date 매개 변수
Sales.CustomerTransactions
테이블의 TransactionDate
열은 date 변수에 대한 예제 열 인수로 사용됩니다.
USE WideWorldImporters;
SELECT CustomerTransactionID,
DATETRUNC(month, TransactionDate) AS MonthTransactionOccurred,
InvoiceID,
CustomerID,
TransactionAmount,
SUM(TransactionAmount) OVER (
PARTITION BY CustomerID ORDER BY TransactionDate,
CustomerTransactionID ROWS UNBOUNDED PRECEDING
) AS RunningTotal,
TransactionDate AS ActualTransactionDate
FROM [WideWorldImporters].[Sales].[CustomerTransactions]
WHERE InvoiceID IS NOT NULL
AND DATETRUNC(month, TransactionDate) >= '2015-12-01';
F. 식 및 date 매개 변수
date 매개 변수는 T-SQL 날짜 형식 또는 datetime2(7)로 확인할 수 있는 문자열 리터럴로 확인할 수 있는 모든 식을 허용합니다. Sales.CustomerTransactions
테이블의 TransactionDate
열은 date 매개 변수에 대한 식 사용의 예를 보여주는 인공 인수로 사용됩니다.
SELECT DATETRUNC(m, SYSDATETIME());
SELECT DATETRUNC(yyyy, CONVERT(date, '2021-12-1'));
USE WideWorldImporters;
GO
SELECT DATETRUNC(month, DATEADD(month, 4, TransactionDate))
FROM Sales.CustomerTransactions;
GO
G. 최대 정밀도를 나타내는 datepart로 date 자르기
datepart가 입력 날짜 형식과 동일한 단위 최대 정밀도를 갖는 경우 입력 날짜를 이 datepart로 자르면 효과가 없습니다.
예 1
DECLARE @d datetime = '2015-04-29 05:06:07.123';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
다음은 입력 datetime과 잘린 date가 동일하다는 것을 보여주는 결과 집합입니다.
Input 2015-04-29 05:06:07.123
Truncated 2015-04-29 05:06:07.123
예제 2
DECLARE @d date = '2050-04-04';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(day, @d);
다음은 입력 datetime과 잘린 date가 동일하다는 것을 보여주는 결과 집합입니다.
Input 2050-04-04
Truncated 2050-04-04
예제 3: smalldatetime 정밀도
smalldatetime은 초 필드가 있더라도 가장 가까운 분까지만 정확합니다. 따라서 가장 가까운 분 또는 가장 가까운 초로 잘리면 아무런 효과가 없습니다.
DECLARE @d smalldatetime = '2009-09-11 12:42:12'
SELECT 'Input', @d;
SELECT 'Truncated to minute', DATETRUNC(minute, @d)
SELECT 'Truncated to second', DATETRUNC(second, @d);
결과 집합은 입력 smalldatetime 값이 잘린 값과 동일하다는 것을 보여줍니다.
Input 2009-09-11 12:42:00
Truncated to minute 2009-09-11 12:42:00
Truncated to second 2009-09-11 12:42:00
예제 4: datetime 정밀도
datetime은 최대 3.33밀리초까지만 정확합니다. 따라서 datetime을 밀리초로 자르면 기대하는 것과 다른 결과가 생성될 수 있습니다. 그러나 이 잘린 값은 내부적으로 저장된 datetime 값과 동일합니다.
DECLARE @d datetime = '2020-02-02 02:02:02.002';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
다음은 잘린 date가 저장된 date와 동일하다는 것을 보여주는 결과 집합입니다. DECLARE
문을 기반으로 예상한 것과 다를 수 있습니다.
Input 2020-02-02 02:02:02.003
Truncated 2020-02-02 02:02:02.003
설명
date 잘림이 해당 날짜 형식에서 지원하는 최소 날짜 이전의 날짜로 역추적하려고 하면 DATE TOO SMALL
오류가 발생합니다. 이는 week
datepart를 사용하는 경우에만 발생합니다. 모든 T-SQL 날짜 형식이 동시에 최소 날짜로 월요일을 사용하기 때문에 iso_week
datepart를 사용할 때는 발생할 수 없습니다. 해당 결과 오류 메시지가 포함된 예제는 다음과 같습니다.
DECLARE @d date= '0001-01-01 00:00:00';
SELECT DATETRUNC(week, @d);
Msg 9837, Level 16, State 3, Line 84
An invalid date value was encountered: The date value is less than the minimum date value allowed for the data type.
사용된 datepart가 DATETRUNC
함수 또는 입력 날짜 데이터 형식에서 지원되지 않는 경우 DATEPART
오류가 발생합니다. 이 오류는 다음과 같은 경우에 발생할 수 있습니다.
DATETRUNC
에서 지원되지 않는 datepart(예:weekday
,tzoffset
또는nanosecond
)를 사용합니다.time 관련 datepart는 date 데이터 형식과 함께 사용되거나 date 관련 datepart는 time 데이터 형식과 함께 사용됩니다. 해당 결과 오류 메시지가 포함된 예제는 다음과 같습니다.
DECLARE @d time = '12:12:12.1234567'; SELECT DATETRUNC(year, @d);
Msg 9810, Level 16, State 10, Line 78 The datepart year is not supported by date function datetrunc for data type time.
datepart에는 데이터 형식에서 지원하는 것보다 더 높은 소수 시간 배율이 필요합니다(소수 시간 배율 정밀도 참조). 해당 결과 오류 메시지가 포함된 예제는 다음과 같습니다.
DECLARE @d datetime2(3) = '2021-12-12 12:12:12.12345'; SELECT DATETRUNC(microsecond, @d);
Msg 9810, Level 16, State 11, Line 81 The datepart microsecond is not supported by date function datetrunc for data type datetime2.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기