Du kan bruge SWITCHOFFSET()
funktion i SQL Server for at ændre tidszoneforskydningen på en datetimeoffset værdi.
Funktionen accepterer to argumenter; en datotidsforskydning(n) værdi (eller et udtryk, der kan løses til en datetimeoffset(n) værdi), og den nye tidszone.
Eksempel
Her er et eksempel til at demonstrere.
DECLARE @dto datetimeoffset ='2020-12-20 17:33:59.8900000 +02:00';SELECT @dto AS [Original], SWITCHOFFSET(@dto, '+04:00') AS [ Ændret];
Resultat (ved hjælp af lodret output):
Bemærk, at tidszoneforskydningen er angivet som en streng. Dette er fordi jeg leverede det på timer.
Når det er angivet i timer, skal tidszoneforskydningen bruge formatet [+|-]TZH:TZM og angives som en streng (omsluttet af enkelte anførselstegn).
Brug minutter som tidszoneforskydning
Du kan alternativt angive tidszoneforskydningen i minutter. Når du gør dette, skal du angive det som et heltal.
DECLARE @dto datetimeoffset ='2020-12-20 17:33:59.8900000 +02:00';SELECT @dto AS [Original], SWITCHOFFSET(@dto, 240) AS [Modified];
Resultat (ved hjælp af lodret output):
Databaseeksempel
Her er et eksempel på brug af SWITCHOFFSET()
på værdien fra en kolonne i en databasetabel.
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 ModifiedFROM Test;
Resultat (ved hjælp af lodret output):
Kol1 | 1967-12-20 17:33:59.8900000 -07:00Ændret | 1967-12-20 16:33:59.8900000 -08:00
Ydeevne ved brug af en GETDATE()-værdi
Microsoft anbefaler, at du bruger SWITCHOFFSET()
med GETDATE()
funktion kan få forespørgslen til at køre langsomt, fordi forespørgselsoptimeringsværktøjet ikke er i stand til at opnå nøjagtige kardinalitetsestimater for datetime værdi.
For at løse dette problem skal du bruge OPTION (RECOMPILE)
forespørgselstip. Dette tvinger forespørgselsoptimeringsværktøjet til at omkompilere en forespørgselsplan, næste gang den samme forespørgsel udføres.
Kender du ikke tidszoneforskydningen?
Hvis du ikke kender den tidszoneforskydning, du skal bruge, kan du se her, hvordan du får en liste over understøttede tidszoner i SQL Server.
En ting du skal være opmærksom på er sommertid. Mange lande/regioner har deres egne specifikke regler for observation af sommertid (og nogle overholder det slet ikke). Dette kan forårsage alle mulige problemer, når du forsøger at finde ud af, om du skal inddrage sommertid i dine tidszoneforskydninger.
Heldigvis kom SQL Server med en måde at håndtere dette på. SQL Server 2016 introducerede AT TIME ZONE
klausul. Denne klausul giver dig mulighed for at angive navnet på en tidszone i stedet for selve tidszoneforskydningen. Derfor kan du blot bruge 'US Mountain Standard Time' eller 'India Standard Time' eller hvilken tidszone der er gældende.
Se Konverter en dato til en anden tidszone for eksempler på, hvordan du gør dette.