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 dayofyearday와 동일한 방식으로 잘립니다.
day dd, d daydayofyear과 동일한 방식으로 잘립니다.
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, timezoneoffsetnanosecond T-SQL 날짜 파트가 지원되지 않습니다.

date

유효한 T-SQL 날짜 또는 시간 형식으로 확인할 수 있는 식, 열 또는 사용자 정의 변수를 허용합니다. 유효한 유형은 다음과 같습니다.

  • smalldatetime
  • 날짜/시간
  • date
  • time
  • datetime2
  • datetimeoffset

date 매개 변수를 date 데이터 형식과 혼동하지 마세요.

또한 DATETRUNCdatetime2(7)로 확인할 수 있는 문자열 리터럴(모든 문자열 형식)을 허용합니다.

반환 형식

DATETRUNC에 대해 반환된 데이터 형식은 동적입니다. DATETRUNC는 입력 날짜와 동일한 데이터 형식(및 해당하는 경우 동일한 소수 시간 배율)의 잘린 날짜를 반환합니다. 예를 들어 DATETRUNCdatetimeoffset(3) 입력 날짜가 지정된 경우 datetimeoffset(3)을 반환합니다. datetime2(7)로 확인할 수 있는 문자열 리터럴이 제공된 경우 DATETRUNCdatetime2(7)를 반환합니다.

소수 시간 배율 정밀도

밀리초의 소수 시간 배율은 3(.123)이고, 마이크로초의 소수 시간 배율은 6(.123456)이고, 나노초의 소수 시간 배율은 9(.123456789)입니다. time, datetime2, datetimeoffset 데이터 형식은 최대 소수 시간 배율 7(.1234567)을 허용합니다. 따라서 milliseconddatepart로 자르려면 소수 시간 배율이 3 이상이어야 합니다. 마찬가지로 microseconddatepart로 자르려면 시간 배율이 6 이상이어야 합니다. T-SQL 날짜 형식이 소수 시간 배율 9를 지원하지 않으므로 DATETRUNCnanoseconddatepart를 지원하지 않습니다.

예제

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 설정

다음 예제에서는 weekdatepart와 함께 @@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. 최대 정밀도를 나타내는 datepartdate 자르기

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 오류가 발생합니다. 이는 weekdatepart를 사용하는 경우에만 발생합니다. 모든 T-SQL 날짜 형식이 동시에 최소 날짜로 월요일을 사용하기 때문에 iso_weekdatepart를 사용할 때는 발생할 수 없습니다. 해당 결과 오류 메시지가 포함된 예제는 다음과 같습니다.

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.

사용된 datepartDATETRUNC 함수 또는 입력 날짜 데이터 형식에서 지원되지 않는 경우 DATEPART 오류가 발생합니다. 이 오류는 다음과 같은 경우에 발생할 수 있습니다.

  1. DATETRUNC에서 지원되지 않는 datepart(예: weekday, tzoffset 또는 nanosecond)를 사용합니다.

  2. time 관련 datepartdate 데이터 형식과 함께 사용되거나 date 관련 dateparttime 데이터 형식과 함께 사용됩니다. 해당 결과 오류 메시지가 포함된 예제는 다음과 같습니다.

    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.
    
  3. 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.
    

참고 항목