DATETRUNC(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server 2022(16.x) Azure SQL Database Azure SQL Managed Instance SQL 분석 엔드포인트
함수는 DATETRUNC
지정된 datepart로 잘린 입력 날짜를 반환합니다.
참고 항목
DATETRUNC
는 SQL Server 2022(16.x)에서 도입되었습니다.
구문
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 |
참고 항목
평일, 표준 시간대 오프셋 및 nanosecd T-SQL 날짜 파트는 지원DATETRUNC
되지 않습니다.
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
)을 허용합니다. 따라서 datepart로 millisecond
자르려면 소수 자릿수가 3 이상이어야 합니다. 마찬가지로 datepart로 microsecond
자르려면 소수 자릿수가 6 이상이어야 합니다. DATETRUNC
는 T-SQL 날짜 형식이 nanosecond
소수 자릿수 9를 지원하지 않으므로 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 설정
다음 예제에서는 datepart와 @@DATEFIRST
함께 설정을 사용하는 방법을 week
보여 줍니다.
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;
GO
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);
결과 집합은 다음과 같습니다. 입력 날짜/시간 및 잘린 날짜 매개 변수는 동일합니다.
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);
결과 집합은 다음과 같습니다. 입력 날짜/시간 및 잘린 날짜 매개 변수는 동일합니다.
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 값과 동일합니다.
DECLARE @d datetime = '2020-02-02 02:02:02.002';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
결과 집합은 다음과 같습니다. 잘린 날짜는 저장된 날짜와 같습니다. 문에 DECLARE
따라 예상한 것과 다를 수 있습니다.
Input 2020-02-02 02:02:02.003
Truncated 2020-02-02 02:02:02.003
설명
날짜 잘림이 해당 데이터 형식에서 지원하는 최소 날짜 이전의 날짜로 역추적하려고 하면 오류가 throw됩니다. 이 오류는 datepart를 사용하는 week
경우에만 발생합니다. 모든 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
함수 또는 입력 날짜 데이터 형식이 사용된 datepart를 지원하지 않는 경우 DATETRUNC
오류가 throw됩니다. 이 오류는 다음과 같은 경우에 발생할 수 있습니다.
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.