ZUR ZEITZONE (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höhere Versionen von Azure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse Analytics SQL Analytics-Endpunktin Microsoft FabricWarehouse in Microsoft FabricSQL-Datenbank in Microsoft Fabric SQL-Datenbank in Microsoft Fabric

Die AT TIME ZONE Transact-SQL (T-SQL)-Anweisung wandelt einen input_date in den entsprechenden Datum-Zeit-Offset-Wert in der Zielzeitzone um. Wenn input_date ohne Offset-Informationen angegeben wird, wendet die Funktion den Offset der Zeitzone an, vorausgesetzt , input_date befindet sich in der Zielzeitzone.

Wenn input_date als Datetimeoffset-Wert angegeben wird, wandelt AT TIME ZONE die Klausel ihn mithilfe der Zeitzonen-Umwandlungsregeln in die Zielzeitzone um.

Die AT TIME ZONE Implementierung basiert auf einem Windows-Mechanismus, um Datumszeitwerte über Zeitzonen hinweg umzuwandeln.

Transact-SQL-Syntaxkonventionen

Syntax

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

Arguments

input_date

Ein Ausdruck, der in einen der folgenden Werte aufgelöst werden kann: smalldatetime, datetime, datetime2 oder datetimeoffset.

'time_zone_value'

Name der Zielzeitzone. time_zone_value ist nvarchar(128).

SQL Server basiert auf in der Windows-Registrierung gespeicherten Zeitzonen. Auf dem Computer installierte Zeitzonen werden in der folgenden Registrierungsstruktur gespeichert: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Eine Liste installierter Zeitzonen wird ebenfalls über die sys.time_zone_info Systemansicht angezeigt.

Weitere Informationen zu Zeitzonen für SQL Server unter Linux finden Sie unter Configure the time zone for SQL Server 2022 and later versions on Linux.

{ 'time_zone_value' | 'LOKAL' }

Name der Zielzeitzone. time_zone_value ist nvarchar(128), mit einem Standard von LOCAL.

Eine Liste installierter Zeitzonen wird über die sys.time_zone_info Systemansicht angezeigt.

Wenn LOCAL angegeben ist, wird der aktuelle Standardzeitzonenwert der Sitzung auf den ursprünglichen Zeitzonenwert der Sitzung gesetzt, der entweder die Datenbank-Scoped-Option oder die Instanz-Standardoption sein kann.

Rückgabetypen

Gibt den Datentyp von datetimeoffset zurück.

Rückgabewert

Der datetimeoffset-Wert in der Zielzeitzone.

Remarks

AT TIME ZONE wendet bestimmte Regeln für die Umrechnung von Eingabewerten in die Datentypen smalldatetime, datetime und datetime2 an, die in einem Intervall liegen, das durch den Wechsel zur Sommerzeit bestimmt wird:

  • Wenn die Uhr vorgestellt wird, entsteht eine Lücke in der Ortszeit, die dem Zeitraum für die Uhrzeitanpassung entspricht. Dieser Zeitraum entspricht in der Regel einer Stunde, kann je nach Zeitzone aber auch 30 oder 45 Minuten entsprechen. Zeitpunkte innerhalb dieser Lücke werden nach dem Wechsel zur Sommerzeit mithilfe des Offsets konvertiert.

    /*
      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
    
  • Wenn die Uhr wieder zurückgestellt wird, überschneiden sich zwei Stunden der Ortszeit um eine Stunde. In diesem Fall werden Zeitpunkte im Überlappungsintervall mit dem Offset vor der Uhrzeitumstellung dargestellt:

    /*
        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
    

Da Informationen (wie Zeitzonenregeln) außerhalb von SQL Server gespeichert und von Zeit zu Zeit geändert werden, wird die AT TIME ZONE-Funktion als nicht deterministisch klassifiziert.

Datetimeoffset wird zwar in Microsoft Fabric nicht unterstützt, AT TIME ZONE kann aber weiterhin mit datetime2 verwendet werden, wie im folgenden Beispiel gezeigt.

Examples

A. Hinzufügen des Zielzeitzonenoffsets zu datetime ohne Offsetinformationen

Verwenden Sie AT TIME ZONE zum Hinzufügen des Offsets basierend auf Zeitzonenregeln, wenn Sie wissen, dass die ursprünglichen datetime-Werte in derselben Zeitzone bereitgestellt werden:

USE AdventureWorks2025;
GO

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

Hier ist das Ergebnis.

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. Umrechnen von Werten zwischen verschiedenen Zeitzonen

Im folgenden Beispiel werden Werte zwischen verschiedenen Zeitzonen umgerechnet. Die OrderDate Werte sind Datetime und werden nicht mit einem Offset gespeichert, sind aber bekannt als Pacific Standard Time. Der erste Schritt besteht darin, den bekannten Offset zuzuweisen und dann in die neue Zeitzone zu konvertieren:

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;

Hier ist das Ergebnis.

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

Sie können auch eine lokale Variable ersetzen, die die Zeitzone enthält:

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;

Hier ist das Ergebnis.

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. Abfragen von temporalen Tabellen mit einer spezifischen Zeitzone

Das folgende Beispiel wählt Daten aus einer zeitlichen Tabelle unter WideWorldImporters Verwendung der Pazifischen Standardzeit aus.

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;

Hier ist das Ergebnis.

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