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

PostgreSQL/JDBC a TIMESTAMP vs. TIMESTAMPTZ

Obecně používejte TIMESTAMPTZ

Zde je rada od Davida E. Wheelera, odborníka na Postgres, v blogovém příspěvku, jehož název mluví za vše:
Vždy používat TIMESTAMP WITH TIME ZONE (TIMESTAMPTZ)

Pokud sledujete skutečné okamžiky, konkrétní body na časové ose, použijte TIMESTAMP WITH TIME ZONE .

Jedna výjimka:rozdělení

Jedinou výjimkou Wheeler je rozdělení podle časových razítek kvůli technickým omezením. Vzácná výjimka pro většinu z nás.

Informace o rozdělení naleznete v doc a podívejte se na Wiki .

Nesprávné označení

Názvy datových typů timestamp with time zone a timestamp without time zone jsou nesprávná jména. V obě V těchto případech je hodnota data a času uložena v UTC (bez posunu časového pásma). Přečtěte si ještě jednou předchozí větu. UTC, vždy. Fráze „s časovou zónou“ znamená „s pozorností věnovanou časovému pásmu“, nikoli „uložit časové pásmo vedle této hodnoty“. Rozdíl mezi typy je v tom, zda se má použít jakékoli časové pásmo buď během ukládání (INSERT nebo UPDATE) nebo načítání (dotaz SELECT). (Toto chování je popsáno pro Postgres -- Ostatní databáze se velmi liší v tomto ohledu.)

Přesněji by se mělo říci, že ČASOVÁ ZNÁMKA BEZ ČASOVÉHO PÁSMA ukládá hodnoty data a času bez časového pásma. Ale bez jakéhokoli odkazu na časový rámec by každý, kdo by se na tato data díval, musel předpokládat (doufám, modlete se?), že hodnoty jsou UTC. Ale znovu, diskutujte, jak byste tento typ neměli téměř nikdy používat.

Přečtěte si dokument opatrně a trochu experimentujte, abyste si ujasnili své porozumění.

Nezónováno

Pokud chcete uložit obecnou představu o možném čase spíše než o konkrétním okamžiku, použijte jiný typ, TIMESTAMP WITHOUT TIME ZONE .

Například Vánoce letos začínají v první chvíli 25. prosince 2017. To by bylo 2017-12-25T 00:00:00 bez ukazatele časového pásma ani odchylky od UTC. Tato hodnota je pouze mlhavou představou o možných okamžicích. Nemá žádný význam, dokud nepoužijeme časové pásmo (nebo posun). Takže to uložíme pomocí TIMESTAMP WITHOUT TIME ZONE .

Elfové zaměstnávají Santovo Oddělení logistiky speciálních akcí použít časová pásma jako součást procesu plánování. Nejstarší časové pásmo je aktuálně Pacific/Kiribati , 14 hodin před UTC. Elfové tam naplánují Santov první příchod. Elfové naplánují letový plán, který vezme soby do jiných časových pásem, kde krátce poté přijde půlnoc, jako je Pacific/Auckland . S příchodem půlnoci každé zóny pokračují na západ. O hodiny později v Asia/Kolkata , ještě později v Europe/Paris , ještě o několik hodin později v America/Montreal a tak dále.

Každý z těchto konkrétních okamžiků doručení by elfové zaznamenali pomocí WITH TIME ZONE , zatímco tato obecná myšlenka Vánoc by byla uložena jako WITHOUT TIME ZONE .

Další využití v podnikových aplikacích pro WITHOUT TIME ZONE plánuje schůzky déle než několik týdnů. Politici po celém světě mají nevysvětlitelnou zálibu v hraní si s hodinami a předefinování pravidel časového pásma. Připojí se k letnímu času (DST), opustí DST, začnou DST v jiné datum nebo skončí DST v jiné datum nebo posunou své hodiny o 15 minut nebo půl hodiny. To vše v posledních několika letech provedlo Turecko, Spojené státy, Rusko, Venezuela a další.

Politici často tyto změny provádějí s malým varováním. Pokud tedy plánujete návštěvu u zubaře na šest měsíců ve 13:00, měla by být pravděpodobně uložena jako TIMESTAMP WITHOUT TIME ZONE jinak vám politici mohou fakticky změnit schůzku na poledne, 14:00 nebo 13:30.



  1. PostgreSQL Connection Pooling:Část 4 – PgBouncer vs. Pgpool-II

  2. Oracle přejmenovat sloupce z vybrat automaticky?

  3. Architektura databáze pro miliony nových řádků denně

  4. Propojte PDO s databází Oracle