다음을 통해 공유


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

소수 시간 배율 정밀도

밀리초의 소수 시간 배율은 3(.123)이고, 마이크로초의 소수 시간 배율은 6(.123456)이고, 나노초의 소수 시간 배율은 9(.123456789)입니다. time, datetime2, datetimeoffset 데이터 형식은 최대 소수 시간 배율 7(.1234567)을 허용합니다. 따라서 datepartmillisecond 자르려면 소수 자릿수가 3 이상이어야 합니다. 마찬가지로 datepartmicrosecond 자르려면 소수 자릿수가 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. 최대 정밀도를 나타내는 datepartdate 자르기

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됩니다. 이 오류는 다음과 같은 경우에 발생할 수 있습니다.

  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.