AT TIME ZONE (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höherAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric

Konvertiert einen inputdate-Wert in den entsprechenden datetimeoffset-Wert in der Zielzeitzone. Wenn inputdate ohne Offsetinformationen bereitgestellt wird, wendet die Funktion den Zeitzonenoffset an und setzt dabei voraus, dass der Wert von inputdate sich in der Zielzeitzone befindet. Wenn inputdate als datetimeoffset-Wert bereitgestellt wird, konvertiert die AT TIME ZONE-Klausel den Wert mithilfe der Umrechnungsregeln der Zielzeitzone in die Zielzeitzone.

Die Implementierung von AT TIME ZONE hängt von einem Windows-Mechanismus zum Umrechnen von datetime-Werten in verschiedene Zeitzonen ab.

Transact-SQL-Syntaxkonventionen

Syntax

inputdate AT TIME ZONE timezone

Argumente

inputdate

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

timezone

Name der Zielzeitzone. SQL Server basiert auf in der Windows-Registrierung gespeicherten Zeitzonen. Auf dem Computer installierte Zeitzonen werden in der folgenden Registrierungsstruktur gespeichert: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones Eine Liste der installierten Zeitzonen wird auch über die Sicht sys.time_zone_info (Transact-SQL) angezeigt.

Weitere Informationen zu Zeitzonen für SQL Server für Linux finden Sie unter Konfigurieren der Zeitzone für SQL Server 2022 für Linux.

Rückgabetyp

Gibt den Datentyp von datetimeoffset zurück.

Rückgabewert

Der datetimeoffset-Wert in der Zielzeitzone.

Bemerkungen

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.

Obwohl datetimeoffset im Data Warehousing in Microsoft Fabric nicht unterstützt wird, kann AT TIME ZONE wie im folgenden Beispiel weiterhin mit datetime2 verwendet werden.

Beispiele

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 AdventureWorks2022;
GO
  
SELECT SalesOrderID, OrderDate,
    OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;

B. Umrechnen von Werten zwischen verschiedenen Zeitzonen

Im folgenden Beispiel werden Werte zwischen verschiedenen Zeitzonen umgerechnet. Die inputdate-Werte sind datetime und werden nicht mit einem Offset gespeichert. Es ist jedoch bekannt, dass die Pacific Normalzeit für diese gilt. Der erste Schritt besteht darin, den bekannten Offset zuzuweisen und dann in die neue Zeitzone zu konvertieren:

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;

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

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

Im folgenden Beispiel werden Daten aus einer temporalen Tabelle der Pacific Standard Time ausgewählt.

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;

Nächste Schritte