Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ändern des Zeitzonenoffsets für einen datetimeoffset-Wert in SQL Server (T-SQL)

Sie können den SWITCHOFFSET() verwenden Funktion in SQL Server, um den Zeitzonenoffset für ein datetimeoffset zu ändern Wert.

Die Funktion akzeptiert zwei Argumente; ein datetimeoffset(n) value (oder ein Ausdruck, der in ein datetimeoffset(n) aufgelöst werden kann Wert) und die neue Zeitzone.

Beispiel

Hier ist ein Beispiel zur Veranschaulichung.

DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
  @dto AS [Original],
  SWITCHOFFSET(@dto, '+04:00') AS [Modified];

Ergebnis (bei vertikaler Ausgabe):

Original | 2020-12-20 17:33:59.8900000 +02:00
Modified | 2020-12-20 19:33:59.8900000 +04:00

Beachten Sie, dass der Zeitzonenoffset als Zeichenfolge angegeben wird. Das liegt daran, dass ich es in Stunden bereitgestellt habe.

Wenn der Zeitzonen-Offset in Stunden angegeben wird, muss er das Format [+|-]TZH:TZM verwenden und als Zeichenfolge (in einfachen Anführungszeichen eingeschlossen) angegeben werden.

Minuten als Zeitzonenverschiebung verwenden

Alternativ können Sie den Zeitzonenoffset in Minuten angeben. Dabei müssen Sie ihn als Integer angeben.

DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
  @dto AS [Original],
  SWITCHOFFSET(@dto, 240) AS [Modified];

Ergebnis (bei vertikaler Ausgabe):

Original | 2020-12-20 17:33:59.8900000 +02:00
Modified | 2020-12-20 19:33:59.8900000 +04:00

Datenbankbeispiel

Hier ist ein Beispiel für die Verwendung von SWITCHOFFSET() auf den Wert aus einer Spalte in einer Datenbanktabelle.

CREATE TABLE Test 
  (
      Col1 datetimeoffset
  ); 
INSERT INTO Test   
VALUES ('1967-12-20 17:33:59.8900000 -07:00'); 
SELECT 
  Col1,
  SWITCHOFFSET(Col1, '-08:00') AS Modified
FROM Test;

Ergebnis (bei vertikaler Ausgabe):

Col1     | 1967-12-20 17:33:59.8900000 -07:00
Modified | 1967-12-20 16:33:59.8900000 -08:00

Leistung bei Verwendung eines GETDATE()-Werts

Microsoft empfiehlt die Verwendung von SWITCHOFFSET() mit dem GETDATE() -Funktion kann dazu führen, dass die Abfrage langsam ausgeführt wird, da der Abfrageoptimierer keine genauen Kardinalitätsschätzungen für datetime erhalten kann Wert.

Um dieses Problem zu lösen, verwenden Sie die OPTION (RECOMPILE) Abfragehinweis. Dadurch wird der Abfrageoptimierer gezwungen, einen Abfrageplan neu zu kompilieren, wenn dieselbe Abfrage das nächste Mal ausgeführt wird.

Sie kennen den Zeitzonenunterschied nicht?

Wenn Sie den zu verwendenden Zeitzonen-Offset nicht kennen, erfahren Sie hier, wie Sie eine Liste der unterstützten Zeitzonen in SQL Server erhalten.

Eine Sache, die Sie beachten müssen, ist die Sommerzeit. Viele Länder/Regionen haben ihre eigenen spezifischen Regeln für die Einhaltung der Sommerzeit (und einige halten sich überhaupt nicht daran). Dies kann zu allen möglichen Problemen führen, wenn Sie versuchen herauszufinden, ob Sie die Sommerzeit in Ihre Zeitzonenverschiebungen einbeziehen sollen oder nicht.

Glücklicherweise hat SQL Server einen Weg gefunden, damit umzugehen. SQL Server 2016 hat die AT TIME ZONE eingeführt Klausel. Mit dieser Klausel können Sie den Namen einer Zeitzone anstelle des Zeitzonen-Offsets selbst angeben. Daher können Sie einfach die „US Mountain Standard Time“ oder „India Standard Time“ oder eine andere gültige Zeitzone verwenden.

Beispiele dazu finden Sie unter Konvertieren eines Datums in eine andere Zeitzone.