sql >> Databáze >  >> RDS >> Sqlserver

Změna posunu časového pásma na hodnotě datetimeoffset na serveru SQL Server (T-SQL)

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.


  1. 2 způsoby, jak získat informace o oddílu pro tabulku v SQL Server (T-SQL)

  2. Oracle:SQL dotaz, který vrací řádky pouze s číselnými hodnotami

  3. Automatizované testování desktopové aplikace:přehled účelnosti a rámců

  4. uWSGI, Flask, sqlalchemy a postgres:Chyba SSL:dešifrování se nezdařilo nebo špatný záznam mac