Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Modificare l'offset del fuso orario su un valore datetimeoffset in SQL Server (T-SQL)

Puoi usare il SWITCHOFFSET() funzione in SQL Server per modificare l'offset del fuso orario su un datetimeoffset valore.

La funzione accetta due argomenti; un datetimeoffset(n) value (o un'espressione che può essere risolta in un datetimeoffset(n) valore) e il nuovo fuso orario.

Esempio

Ecco un esempio da dimostrare.

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

Risultato (usando l'output verticale):

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

Si noti che l'offset del fuso orario è specificato come una stringa. Questo perché l'ho fornito in poche ore.

Se specificato in ore, l'offset di fuso orario deve utilizzare il formato [+|-]TZH:TZM ed essere specificato come stringa (racchiusa tra virgolette singole).

Utilizza i minuti come scostamento del fuso orario

In alternativa è possibile specificare l'offset del fuso orario in minuti. Quando si esegue questa operazione, è necessario specificarlo come numero intero.

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

Risultato (usando l'output verticale):

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

Esempio di database

Ecco un esempio di utilizzo di SWITCHOFFSET() sul valore di una colonna in una tabella di database.

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;

Risultato (usando l'output verticale):

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

Prestazioni quando si utilizza un valore GETDATE()

Microsoft consiglia di utilizzare SWITCHOFFSET() con il GETDATE() può rallentare l'esecuzione della query, poiché Query Optimizer non è in grado di ottenere stime accurate della cardinalità per il datetime valore.

Per risolvere questo problema, usa OPTION (RECOMPILE) suggerimento per la query. Ciò obbliga Query Optimizer a ricompilare un piano di query la prossima volta che viene eseguita la stessa query.

Non conosci la differenza di fuso orario?

Se non conosci l'offset del fuso orario da utilizzare, ecco come ottenere un elenco dei fusi orari supportati in SQL Server.

Una cosa a cui devi prestare attenzione è l'ora legale. Molti paesi/regioni hanno le proprie regole specifiche per osservare l'ora legale (e alcuni non la osservano affatto). Ciò può causare ogni tipo di problema quando stai cercando di capire se includere o meno l'ora legale negli scostamenti del fuso orario.

Fortunatamente, SQL Server ha trovato un modo per affrontare questo problema. SQL Server 2016 ha introdotto il AT TIME ZONE clausola. Questa clausola consente di specificare il nome di un fuso orario, anziché l'offset del fuso orario stesso. Pertanto, puoi semplicemente utilizzare "US Mountain Standard Time" o "India Standard Time" o qualsiasi fuso orario applicabile.

Consulta Convertire una data in un altro fuso orario per esempi su come farlo.