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

Jak funguje AT TIME ZONE v PostgreSQL

V PostgreSQL můžete použít AT TIME ZONE klauzule pro převod časového razítka na jiné časové pásmo.

Syntaxe

Můžete jej použít s kteroukoli z následujících tří variant:

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Kde zone je časové pásmo, na které chcete převést hodnotu vlevo.

Aby bylo jasno, jediný rozdíl mezi těmito třemi variantami je v datovém typu časového razítka, které se má převést.

Tyto tři datové typy jsou:

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

Výsledek bude záviset na typu dat.

Následující tabulka uvádí výsledek, který každá varianta produkuje.

Výraz Typ návratu Popis
časové razítko s časovým pásmem AT TIME ZONE zone timestamp without time zone Převést dané časové razítko s časovým pásmem na nové časové pásmo bez označení časového pásma
časové razítko bez časového pásma AT TIME ZONE zone timestamp with time zone Zachovat dané časové razítko bez časového pásma jak se nachází v určeném časovém pásmu
čas s časovou zónou AT TIME ZONE zone time with time zone Převést daný čas s časovým pásmem do nového časového pásma

Varianta 1

Co se stane, když převedete timestamp with time zone hodnota.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Výsledek:

2025-11-20 02:00:00

Když je původní časové razítko timestamp with time zone hodnotu, posune se do určeného časového pásma a výsledek se vrátí bez posunu časového pásma.

Zde je to, co se stane, když změním posun časového pásma vstupní hodnoty.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Výsledek:

2025-11-20 01: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ředpokládá místní časové pásmo.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Výsledek:

2025-11-19 16:00:00

V tomto případě bylo výsledné časové razítko posunuto o osm hodin zpět. To znamená, že moje místní časové pásmo je osm hodin před Afrikou/Káhirou.

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 '2025-11-20 00:00:00';

Výsledek:

2025-11-20 00:00:00+10

Varianta 2

Co se stane, když původní časové razítko používá timestamp without time zone hodnota.

Jinými slovy, není zahrnout časové pásmo.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Výsledek:

2025-11-20 08: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 timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Výsledek:

2025-11-20 08: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 '2025-11-20 00:00:00+12';

Výsledek:

2025-11-20 00:00:00

Varianta 3

Co se stane, když původní časové razítko používá time with time zone hodnotu.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Výsledek:

02:00:00+02

Převádí daný time with time zone hodnotu k novému časovému pásmu a k výsledku připojí posun časového pásma.

Zde je to, co se stane, když změním posun časového pásma vstupní hodnoty.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Výsledek:

01:00:00+02

Výsledné časové razítko se posune podle vstupního časového pásma.

A pokud zadáte time with time zone , ale původní časové razítko ve skutečnosti nezahrnuje časové pásmo, předpokládá se místní časové pásmo.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Výsledek:

16:00:00+02

V tomto případě bylo výsledné časové razítko posunuto o osm hodin zpět (protože moje místní časové pásmo je o osm hodin před Afrikou/Káhirou).

Posun časového pásma, který byl použit, můžeme vidět přímým výběrem vstupní hodnoty.

SELECT time with time zone '00:00:00';

Výsledek:

00:00:00+10

Čas bez časového pásma

Ačkoli dokumentace Postgres neobsahuje time without time zone varianta, zde je každopádně příklad.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Výsledek:

16:00:00+02

V tomto příkladu se tedy pro časové pásmo, které má být převedeno, předpokládalo místní časové pásmo.


  1. Zkombinujte více výsledků v poddotazu do jedné hodnoty oddělené čárkami

  2. Mazání řádků pomocí MySQL LEFT JOIN

  3. SQLiteException:tabulka již existuje

  4. Jak nainstalovat balíček ROracle na Windows 7?