sql >> Databáze >  >> RDS >> PostgreSQL

Jak funguje funkce timezone() v PostgreSQL

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.


  1. Pochopení toho, co sp_updatestats skutečně aktualizuje

  2. Jak získat aktuální datum v SQLite

  3. ORA-01017 Neplatné uživatelské jméno/heslo při připojování k 11g databázi z 9i klienta

  4. Jak zálohovat/obnovit MySQL/MariaDB a PostgreSQL pomocí nástrojů „Automysqlbackup“ a „Autopostgresqlbackup“