AT TIME ZONE (Transact-SQL)

Anwendungsbereich: JaSQL Server 2016 (13.x) und höher JaAzure SQL-Datenbank JaVerwaltete Azure SQL-Instanz JaAzure Synapse Analytics

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.

Symbol für Themenlink 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: Der 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 sys.time_zone_info (Transact-SQL)-Sicht angezeigt.

Rückgabetypen

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 29th, 2015 at 02:00:00.   
        Adjusted local time became 2015-03-29 03:00:00.  
    */  
    
    --Time before DST change has standard time offset (+01:00)
    SELECT CONVERT(DATETIME2(0), '2015-03-29T01:01:00', 126)     
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 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), '2015-03-29T02:01:00', 126)   
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 03:01:00 +02:00
    
    --Time after 03:00 is presented with the summer time offset (+02:00)
    SELECT CONVERT(DATETIME2(0), '2015-03-29T03:01:00', 126)   
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 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 25th, 2015 at 03:00:00.
        Adjusted local time became 2015-10-25 02:00:00
    */  
    
    --Time before the change has DST offset (+02:00)
    SELECT CONVERT(DATETIME2(0), '2015-10-25T01:01:00', 126)
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-10-25 01:01:00 +02:00  
    
    /*
      Time from the "overlapped interval" is presented with standard time 
      offset (before the change)
    */
    SELECT CONVERT(DATETIME2(0), '2015-10-25T02:00:00', 126)
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-10-25 02:00:00 +02:00  
    
    
    --Time after 03:00 is regularly presented with the standard time offset (+01:00)
    SELECT CONVERT(DATETIME2(0), '2015-10-25T03:01:00', 126)
    AT TIME ZONE 'Central European Standard Time';
    --Result: 2015-10-25 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.

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 AdventureWorks2016;
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 AdventureWorks2016;
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;

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 AdventureWorks2016;
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