sql >> Databasteknik >  >> RDS >> Sqlserver

Ändra tidszonförskjutningen på ett datumtidsförskjutningsvärde i SQL Server (T-SQL)

Du kan använda SWITCHOFFSET() funktion i SQL Server för att ändra tidszonförskjutningen på en datetimeoffset värde.

Funktionen accepterar två argument; en datetimeoffset(n) värde (eller ett uttryck som kan lösas till en datetimeoffset(n) värde) och den nya tidszonen.

Exempel

Här är ett exempel att visa.

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

Resultat (med vertikal utdata):

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

Observera att tidszonsförskjutningen anges som en sträng. Detta beror på att jag gav det på timmar.

När den anges i timmar måste tidszonsförskjutningen använda formatet [+|-]TZH:TZM och anges som en sträng (omsluten av enkla citattecken).

Använd minuter som tidszonsförskjutning

Du kan alternativt ange tidszonsförskjutningen i minuter. När du gör detta måste du ange det som ett heltal.

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

Resultat (med vertikal utdata):

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

Databasexempel

Här är ett exempel på hur du använder SWITCHOFFSET() på värdet från en kolumn i en databastabell.

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;

Resultat (med vertikal utdata):

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

Prestanda när du använder ett GETDATE()-värde

Microsoft rekommenderar att du använder SWITCHOFFSET() med GETDATE() funktionen kan få frågan att köras långsamt, på grund av att frågeoptimeraren inte kan erhålla korrekta kardinalitetsuppskattningar för datetime värde.

För att lösa det här problemet, använd OPTION (RECOMPILE) frågetips. Detta tvingar frågeoptimeraren att kompilera om en frågeplan nästa gång samma fråga körs.

Känner du inte till tidszonsförskjutningen?

Om du inte vet vilken tidszonsförskjutning som ska användas, så här får du en lista över tidszoner som stöds i SQL Server.

En sak du måste tänka på är sommartid. Många länder/regioner har sina egna specifika regler för att observera sommartid (och vissa följer det inte alls). Detta kan orsaka alla möjliga problem när du försöker räkna ut huruvida sommartid ska räknas in i dina tidszonförskjutningar.

Lyckligtvis kom SQL Server på ett sätt att hantera detta. SQL Server 2016 introducerade AT TIME ZONE klausul. Denna sats låter dig ange namnet på en tidszon, snarare än själva tidszonsförskjutningen. Därför kan du helt enkelt använda "US Mountain Standard Time" eller "India Standard Time" eller vilken tidszon som är tillämplig.

Se Konvertera ett datum till en annan tidszon för exempel på hur du gör detta.


  1. Varför kan jag inte tvinga Oracle 11g att förbruka fler processorer för en enda SQL-fråga

  2. 32-bitars Excel och 64-bitars SQL Server

  3. Varför kan det bara finnas en TIMESTAMP-kolumn med CURRENT_TIMESTAMP i DEFAULT-satsen?

  4. Installera SQL Server Agent Extension på Azure Data Studio