sql >> Database >  >> RDS >> Sqlserver

Wijzig de tijdzone-offset op een datetimeoffset-waarde in SQL Server (T-SQL)

U kunt de SWITCHOFFSET() . gebruiken functie in SQL Server om de tijdzone-offset te wijzigen op een datetimeoffset waarde.

De functie accepteert twee argumenten; a datetimeoffset(n) waarde (of een uitdrukking die kan worden omgezet in een datetimeoffset(n) waarde) en de nieuwe tijdzone.

Voorbeeld

Hier is een voorbeeld om te demonstreren.

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

Resultaat (met verticale uitvoer):

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

Houd er rekening mee dat de tijdzone-offset wordt opgegeven als een tekenreeks. Dit komt omdat ik het in uren heb geleverd.

Indien gespecificeerd in uren, moet de tijdzone-offset het formaat [+|-]TZH:TZM gebruiken en gespecificeerd worden als een string (tussen enkele aanhalingstekens).

Gebruik minuten als tijdzoneverschuiving

Als alternatief kunt u de tijdzone-offset in minuten specificeren. Als je dit doet, moet je het specificeren als een geheel getal.

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

Resultaat (met verticale uitvoer):

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

Databasevoorbeeld

Hier is een voorbeeld van het gebruik van SWITCHOFFSET() op de waarde van een kolom in een 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 Modified
FROM Test;

Resultaat (met verticale uitvoer):

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

Prestaties bij gebruik van een GETDATE()-waarde

Microsoft adviseert dat het gebruik van SWITCHOFFSET() met de GETDATE() functie kan ervoor zorgen dat de zoekopdracht langzaam wordt uitgevoerd, omdat de query-optimizer geen nauwkeurige kardinaliteitsschattingen kan verkrijgen voor de datetime waarde.

Om dit probleem op te lossen, gebruikt u de OPTION (RECOMPILE) vraag hint. Dit dwingt de query-optimizer om een ​​queryplan opnieuw te compileren de volgende keer dat dezelfde query wordt uitgevoerd.

Weet je de tijdzone-offset niet?

Als u niet weet welke tijdzoneoffset u moet gebruiken, kunt u als volgt een lijst met ondersteunde tijdzones in SQL Server krijgen.

Een ding waar u rekening mee moet houden, is de zomertijd. Veel landen/regio's hebben hun eigen specifieke regels voor het observeren van zomertijd (en sommige houden zich er helemaal niet aan). Dit kan allerlei problemen veroorzaken wanneer u probeert uit te vinden of u de zomertijd al dan niet in uw tijdzoneverschuivingen moet incalculeren.

Gelukkig heeft SQL Server een manier bedacht om hiermee om te gaan. SQL Server 2016 introduceerde de AT TIME ZONE clausule. Met deze clausule kunt u de naam van een tijdzone specificeren, in plaats van de tijdzone-offset zelf. Daarom kunt u gewoon 'US Mountain Standard Time' of 'India Standard Time' of welke tijdzone dan ook gebruiken.

Zie Een datum converteren naar een andere tijdzone voor voorbeelden over hoe u dit kunt doen.


  1. Hoe epoch naar mySQL-tijdstempel in JAVA te converteren

  2. Cursorlusverwerking voortzetten na uitzondering in Oracle

  3. 2 manieren om rijen te retourneren die alleen niet-alfanumerieke tekens bevatten in Oracle

  4. LOCALTIME-voorbeelden - MySQL