AT TIME ZONE(Transact-SQL)

적용 대상:Microsoft Fabric의 MicrosoftFabric SQL Database에 있는 Microsoft Fabric Warehouse의 SQL Server 2016(13.x) 이상 버전 Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL 분석 엔드포인트

Transact-SQL(T-SQL) 문은 AT TIME ZONEinput_date 를 대상 시간 대의 해당 datetimeoffset 값으로 변환합니다. 오프셋 정보 없이 input_date 가 제공될 경우, input_date 가 목표 시간대에 속한다고 가정하여 해당 시간대의 오프셋을 적용합니다.

만약 input_date 가 datetimeoffset 값으로 제공된다면, AT TIME ZONE clause는 시간대 변환 규칙을 사용하여 이를 목표 시간대로 변환합니다.

AT TIME ZONE 이 구현은 Windows 메커니즘을 통해 datetime 값을 시간대 간에 변환합니다.

Transact-SQL 구문 표기 규칙

Syntax

input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }

Arguments

input_date

smalldatetime, datetime, datetime2 또는 datetimeoffset 값으로 확인할 수 있는 식입니다.

'time_zone_value'

대상 표준 시간대의 이름입니다. time_zone_valuenvarchar(128)입니다.

SQL Server은 Windows 레지스트리에 저장된 표준 시간대를 따릅니다. 컴퓨터에 설치된 표준 시간대는 다음 레지스트리 하이브 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones에 저장됩니다.

설치된 시간대 목록도 sys.time_zone_info 시스템 뷰를 통해 노출됩니다.

SQL Server on Linux의 표준 시간대에 대한 자세한 내용은 Linux에서 SQL Server 2022 이상 버전에 대한 표준 시간대 구성을 참조하세요.

{ 'time_zone_value' | '로컬'}

대상 표준 시간대의 이름입니다. time_zone_valuenvarchar(128)이며, 기본값은 입니다.LOCAL

설치된 시간대 목록이 sys.time_zone_info 시스템 뷰를 통해 노출됩니다.

만약 가 지정된다면 LOCAL , 세션의 현재 기본 시간대 값은 세션의 원래 시간대 값으로 설정되며, 이는 데이터베이스 범위 옵션 또는 인스턴스 기본값일 수 있습니다.

반환 형식

datetimeoffset의 데이터 형식을 반환합니다.

반환 값

대상 표준 시간대의 datetimeoffset 값입니다.

Remarks

AT TIME ZONE 는 DST 변경의 영향을 받는 간격에 속하는 smalldatetime, datetime 및 datetime2 데이터 형식의 입력 값을 변환하기 위한 특정 규칙을 적용합니다.

  • 시간이 미리 설정되어 있으면 현지 시간에는 시간 조정 기간과 동일한 간격이 있습니다. 이 기간은 일반적으로 1시간이지만 표준 시간대에 따라 30분 또는 45분이 될 수 있습니다. 이 간격에 있는 시간대의 지점은 DST 변경 후에 오프셋으로 변환됩니다.

    /*
      Moving to DST in "Central European Standard Time" zone:
      offset changes from +01:00 -> +02:00
      Change occurred on March 27th, 2022 at 02:00:00.
      Adjusted local time became 2022-03-27 03:00:00.
    */
    
    --Time before DST change has standard time offset (+01:00)
    SELECT CONVERT (DATETIME2 (0), '2022-03-27T01:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-03-27 01:01:00 +01:00
    /*
      Adjusted time from the "gap interval" (between 02:00 and 03:00)
      is moved 1 hour ahead and presented with the summer time offset
      (after the DST change)
    */
    SELECT CONVERT (DATETIME2 (0), '2022-03-27T02:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-03-27 03:01:00 +02:00
    
    --Time after 03:00 is presented with the summer time offset (+02:00)
    SELECT CONVERT (DATETIME2 (0), '2022-03-27T03:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-03-27 03:01:00 +02:00
    
  • 클록을 늦춰 설정한 경우 로컬 시간으로 2시간은 1시간과 겹칩니다. 이 경우 겹친 간격에 속하는 시간대의 지점은 클록 변경 전에 오프셋으로 표시됩니다.

    /*
        Moving back from DST to standard time in
        "Central European Standard Time" zone:
        offset changes from +02:00 -> +01:00.
        Change occurred on October 30th, 2022 at 03:00:00.
        Adjusted local time became 2022-10-30 02:00:00
    */
    
    --Time before the change has DST offset (+02:00)
    SELECT CONVERT (DATETIME2 (0), '2022-10-30T01:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-10-30 01:01:00 +02:00
    /*
      Time from the "overlapped interval" is presented with DST offset (before the change)
    */
    SELECT CONVERT (DATETIME2 (0), '2022-10-30T02:00:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-10-30 02:00:00 +02:00
    
    --Time after 03:00 is regularly presented with the standard time offset (+01:00)
    SELECT CONVERT (DATETIME2 (0), '2022-10-30T03:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-10-30 03:01:00 +01:00
    

일부 정보(예: 표준 시간대 규칙)는 SQL Server 외부에서 유지 관리되며 가끔 변경 AT TIME ZONE 될 수 있으므로 함수는 비결정적 정보로 분류됩니다.

datetimeoffset다음 예제와 같이 datetime2AT TIME ZONE계속 사용할 수 있습니다.

Examples

A. 오프셋 정보 없는 날짜/시간에 대상 표준 시간대 오프셋 추가

원래 AT TIME ZONE 값이 동일한 표준 시간대에 제공된 것을 알고 있는 경우 표준 시간대 규칙에 따라 오프셋을 추가하는 데 사용합니다.

USE AdventureWorks2025;
GO

SELECT SalesOrderID,
       OrderDate,
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;

결과 집합은 다음과 같습니다.

SalesOrderID OrderDate               OrderDate_TimeZonePST
------------ ----------------------- -------------------------------
43659        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43660        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43661        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43662        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43663        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43664        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
...

B. 다른 표준 시간대 사이의 값 변환

다음 예제에서는 다른 표준 시간대 사이의 값을 변환합니다. 값은 OrderDate datetime이며 오프셋과 함께 저장되지 않지만 Pacific Standard Time으로 알려져 있습니다. 첫 번째 단계는 알려진 오프셋을 할당한 다음, 새 표준 시간대로 변환하는 것입니다.

USE AdventureWorks2025;
GO

SELECT SalesOrderID,
       OrderDate,
       --Assign the known offset only
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
       --Assign the known offset, then convert to another time zone
       OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE 'Central European Standard Time' AS OrderDate_TimeZoneCET
FROM Sales.SalesOrderHeader;

결과 집합은 다음과 같습니다.

SalesOrderID OrderDate               OrderDate_TimeZonePST          OrderDate_TimeZoneCET
------------ ----------------------- ------------------------------ -------------------------------
43659        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...

표준 시간대를 포함하는 지역 변수로 대체할 수도 있습니다.

USE AdventureWorks2025;
GO

DECLARE @CustomerTimeZone AS NVARCHAR (128) = 'Central European Standard Time';

SELECT SalesOrderID,
       OrderDate,
       --Assign the known offset only
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
       --Assign the known offset, then convert to another time zone
       OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE @CustomerTimeZone AS OrderDate_TimeZoneCustomer
FROM Sales.SalesOrderHeader;

결과 집합은 다음과 같습니다.

SalesOrderID OrderDate               OrderDate_TimeZonePST          OrderDate_TimeZoneCustomer
------------ ----------------------- ------------------------------ -------------------------------
43659        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...

C. 특정 표준 시간대를 사용하여 임시 테이블 쿼리

다음 예시는 태평양 표준시를 사용하여 시간 표 WideWorldImporters 에서 데이터를 선택합니다.

USE WideWorldImporters;
GO

DECLARE @ASOF AS DATETIMEOFFSET;
SET @ASOF = DATEADD(MONTH, -1, GETDATE()) AT TIME ZONE 'UTC';

-- Query state of the table a month ago projecting period
-- columns as Pacific Standard Time
SELECT CustomerID,
       CustomerName,
       ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ASOF;

결과 집합은 다음과 같습니다.

CustomerID CustomerName                        ValidFrom
---------- ----------------------------------- ----------------------------------
1          Tailspin Toys (Head Office)         2013-01-01 00:00:00.0000000 -08:00
2          Tailspin Toys (Sylvanite, MT)       2013-01-01 00:00:00.0000000 -08:00
3          Tailspin Toys (Peeples Valley, AZ)  2013-01-01 00:00:00.0000000 -08:00
4          Tailspin Toys (Medicine Lodge, KS)  2013-01-01 00:00:00.0000000 -08:00
5          Tailspin Toys (Gasport, NY)         2013-01-01 00:00:00.0000000 -08:00
6          Tailspin Toys (Jessie, ND)          2013-01-01 00:00:00.0000000 -08:00