Můžete použít SWITCHOFFSET()
funkce v SQL Server změnit posun časového pásma na datetimeoffset hodnotu.
Funkce přijímá dva argumenty; a datetimeoffset(n) hodnota (nebo výraz, který lze přeložit na datetimeoffset(n) hodnota) a nové časové pásmo.
Příklad
Zde je příklad k demonstraci.
DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
@dto AS [Original],
SWITCHOFFSET(@dto, '+04:00') AS [Modified];
Výsledek (při použití vertikálního výstupu):
Original | 2020-12-20 17:33:59.8900000 +02:00 Modified | 2020-12-20 19:33:59.8900000 +04:00
Všimněte si, že posun časového pásma je zadán jako řetězec. To proto, že jsem to poskytl v hodinách.
Pokud je zadán v hodinách, posun časového pásma musí používat formát [+|-]TZH:TZM a musí být zadán jako řetězec (uzavřený v jednoduchých uvozovkách).
Použít minuty jako posun časového pásma
Alternativně můžete zadat posun časového pásma v minutách. Když to uděláte, musíte jej zadat jako celé číslo.
DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
@dto AS [Original],
SWITCHOFFSET(@dto, 240) AS [Modified];
Výsledek (při použití vertikálního výstupu):
Original | 2020-12-20 17:33:59.8900000 +02:00 Modified | 2020-12-20 19:33:59.8900000 +04:00
Příklad databáze
Zde je příklad použití SWITCHOFFSET()
na hodnotu ze sloupce v databázové tabulce.
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;
Výsledek (při použití vertikálního výstupu):
Col1 | 1967-12-20 17:33:59.8900000 -07:00 Modified | 1967-12-20 16:33:59.8900000 -08:00
Výkon při použití hodnoty GETDATE()
Microsoft doporučuje použít SWITCHOFFSET()
pomocí GETDATE()
funkce může způsobit, že dotaz bude probíhat pomalu, protože optimalizátor dotazu není schopen získat přesné odhady mohutnosti pro datum a čas hodnota.
Chcete-li tento problém vyřešit, použijte OPTION (RECOMPILE)
nápověda k dotazu. To přinutí optimalizátor dotazů znovu zkompilovat plán dotazů při příštím spuštění stejného dotazu.
Neznáte posun časového pásma?
Pokud neznáte posunutí časového pásma, které se má použít, zde je návod, jak získat seznam podporovaných časových pásem na serveru SQL.
Jedna věc, kterou musíte mít na paměti, je letní čas. Mnoho zemí/regionů má svá specifická pravidla pro dodržování letního času (a některé je nedodržují vůbec). To může způsobit nejrůznější problémy, když se snažíte zjistit, zda zahrnout letní čas do posunu časového pásma, či nikoli.
Naštěstí SQL Server přišel na způsob, jak se s tím vypořádat. SQL Server 2016 představil AT TIME ZONE
doložka. Tato klauzule vám umožňuje zadat název časového pásma, nikoli samotný posun časového pásma. Proto můžete jednoduše použít „americký horský standardní čas“ nebo „indický standardní čas“ nebo jakékoli platné časové pásmo.
Příklady, jak to provést, naleznete v části Převod data na jiné časové pásmo.