AT TIME ZONE (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

inputdate を対応する datetimeoffset 値に変換先のタイム ゾーンで変換します。 inputdate がオフセット情報なしで提供されると、この関数は、inputdate が変換先のタイム ゾーン内であるものと想定して、タイム ゾーンのオフセットを適用します。 inputdatedatetimeoffset 値として与えられる場合、AT TIME ZONE 句はタイム ゾーン変換規則を利用して変換先のタイム ゾーンにそれを変換します。

AT TIME ZONE の実装は、タイム ゾーン間で datetime 値を変換する Windows メカニズムに依存します。

Transact-SQL 構文表記規則

構文

inputdate AT TIME ZONE timezone

引数

inputdate

smalldatetimedatetimedatetime2datetimeoffset 値に解決できる式。

timezone

変換先のタイム ゾーンの名前。 SQL Server は Windows レジストリに格納されているタイム ゾーンに依存します。 コンピューターにインストールされているタイム ゾーンは、次のレジストリ ハイブに格納されています: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones。 インストールされているタイム ゾーンの一覧も、 sys.time_zone_info ビューを通じて公開されます。

SQL Server on Linux のタイム ゾーンの詳細については、「SQL Server 2022 on Linux でタイム ゾーンを構成する」を参照してください。

戻り値の型

datetimeoffset のデータ型を返します。

戻り値

変換先のタイム ゾーンの datetimeoffset 値。

解説

AT TIME ZONE は、データ型 smalldatetimedatetimedatetime2 の入力値が DST 変更の影響を受ける時間間隔に分類されるとき、特別な入力値変換ルールを適用します。

  • 時計が進んでいると、現地時刻には時計調整の継続時間と等しい隔たりが存在します。 この継続時間は通常は 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は Microsoft Fabric のデータ ウェアハウスではサポートされていませんが、次の例のように、AT TIME ZONEは引き続き datetime2 で使用できます。

A. オフセット情報なしで、変換先のタイム ゾーンのオフセットを datetime に追加する

元の datetime 値が同じタイム ゾーンで与えられることがわかっているとき、タイム ゾーン ルールに基づいてオフセットを追加するには、AT TIME ZONE を使用します。

USE AdventureWorks2022;
GO

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

B. 異なるタイム ゾーン間で値を変換する

次の例では、異なるタイム ゾーン間で値を変換します。 OrderDate値は datetime オフセットと共に格納されませんが、太平洋標準時と呼ばれます。 最初の手順では、既知のオフセットを割り当ててから、新しいタイム ゾーンに変換します。

USE AdventureWorks2022;
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;

タイム ゾーンを含むローカル変数に置き換えることもできます。

USE AdventureWorks2022;
GO

DECLARE @CustomerTimeZone 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;

C. 特定のタイム ゾーンを使用して、テンポラル テーブルに対してクエリを実行する

次の例では、太平洋標準時を使用してテンポラル テーブルからデータを選択します。

USE AdventureWorks2022;
GO

DECLARE @ASOF 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 BusinessEntityID,
    PersonType,
    NameStyle,
    Title,
    FirstName,
    MiddleName,
    ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM Person.Person_Temporal
FOR SYSTEM_TIME AS OF @ASOF;