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.