V PostgreSQL můžete použít timezone()
funkce pro převod časového razítka na jiné časové pásmo.
Syntaxe
Syntaxe vypadá takto:
timezone(zone, timestamp)
Kde zone
je časové pásmo, pro které chcete mít timestamp
argument, na který se má převést.
Výsledek, který získáte, bude záviset na tom, zda původní hodnota časového razítka zahrnuje časové pásmo nebo ne (a jaká je tato hodnota).
Příklad 1 – Když původní časové razítko obsahuje časové pásmo
Co se stane, když původní časové razítko obsahuje časové pásmo.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Výsledek:
2020-10-25 04:00:00
Když původní časové razítko obsahuje časové pásmo, timezone()
funkce posune původní hodnotu časového razítka do určeného časového pásma a vrátí hodnotu bez časového pásma.
Zde je to, co se stane, když změním časové pásmo vstupního časového razítka.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Výsledek:
2020-10-25 03:00:00
Výsledné časové razítko se posune podle vstupního časového pásma.
A pokud zadáte timestamp with time zone
, ale původní časové razítko ve skutečnosti nezahrnuje časové pásmo, pak se původní hodnota časového razítka přesune do místního časového pásma.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Výsledek:
2020-10-24 18:00:00
V tomto případě bylo výsledné časové razítko posunuto o šest hodin zpět. To znamená, že moje místní časové pásmo je o šest hodin před Indií/Mauriciem.
Posun časového pásma, který byl použit, můžeme vidět přímým výběrem vstupní hodnoty.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Výsledek:
2020-10-25 00:00:00+10
Příklad 2 – Když původní časové razítko NEZAHRNUJE časové pásmo
Co se stane, když původní časové razítko není zahrnout časové pásmo.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Výsledek:
2020-10-25 06:00:00+10
Pokud původní časové razítko nezahrnuje časové pásmo, výsledek se zobrazí pomocí aktuálního TimeZone
je připojeno nastavení a posun časového pásma.
To platí vždy, když zadáte timestamp without time zone
, i když časové razítko ve skutečnosti obsahuje posun časového pásma.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Výsledek:
2020-10-25 06:00:00+10
To se dá očekávat, protože pokud vyberu pouze timestamp without time zone
hodnota, to je to, co dostanu:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Výsledek:
2020-10-25 00:00:00
Příklad 3 – místní časové razítko
Použijme localtimestamp
funkce pro spuštění porovnání mezi aktuálním časovým razítkem v mém vlastním časovém pásmu a výsledným časovým razítkem po použití timezone()
funkci převést na jiné časové pásmo.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Výsledek:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
localtimestamp
funkce vrací časové razítko datový typ, který je dodáván s implicitním „bez časového pásma“. Jinými slovy, časové razítko a časové razítko bez časového pásma jsou to samé.
Jak bylo ukázáno dříve, když není v původním časovém razítku uvedeno žádné časové pásmo, aktuální TimeZone
nastavení je použito a připojeno k výsledku. A to je to, co získáme při použití localtimestamp
.
Mimochodem, v tomto příkladu jsem použil \x
k zobrazení výsledku pomocí rozšířeného zobrazení/vertikálního výstupu, jen aby byl snazší čitelný.
Příklad 4 – aktuální_časové razítko
Nyní použijeme current_timestamp
místo localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Výsledek (při použití vertikálního výstupu):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Tentokrát byl posun časového pásma připojen k původnímu časovému razítku a timezone()
výsledek jej již neobsahuje.
Tento výsledek jsme získali díky current_timestamp
funkce vrací časové razítko s časovým pásmem datový typ.
Příklad 5 – Použití časových hodnot
timezone()
funkce také funguje s time
hodnoty (time with time zone
a time without time zone
).
Při použití na time with time zone
hodnoty, je k výsledku připojen posun časového pásma.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Výsledek (při použití vertikálního výstupu):
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
A pro úplnost, zde jsou stejné hodnoty s použitím time without time zone
datový typ.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Výsledek (při použití vertikálního výstupu):
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Zkontrolujte místní časové pásmo
Pokud chcete zkontrolovat své vlastní místní časové pásmo, spusťte SHOW TIMEZONE
.
Zde je to, co dostanu, když spustím tento příkaz.
SHOW TIMEZONE;
Výsledek:
Australia/Brisbane
Zkontrolujte posun časového pásma
Vyzbrojen výše uvedenými znalostmi mohu nyní zkontrolovat dva posuny časových pásem dotazem na pg_timezone_names
zobrazit.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Výsledek (při použití vertikálního výstupu):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Další možnosti a příklady pro vrácení časového pásma v Postgresu najdete v tématu Návrat seznamu časových pásem podporovaných PostgreSQL.