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

Časové razítko Postgres

Neexistují zde žádná neprůstřelná řešení.

Moje první rada:nikdy se nespoléhejte na výchozí časové pásmo serveru.

Moje druhá rada:vyberte si mezi timestamp -timestamptz podle (převažující) sémantiky dat.

Podrobněji:PostgresSQL má dvě varianty časového razítka, matouce pojmenované TIMESTAMP WITHOUT TIMEZONE (timestamp) a TIMESTAMP WITH TIMEZONE (timestamptz) . Vlastně ani jedno ukládá časové pásmo, dokonce ani posun. Oba datové typy zabírají stejnou šířku (4 bajty) a jejich rozdíl je nepatrný - a co je horší, může vás kousnout, pokud jim plně nerozumíte a váš server změní časové pásmo. Můj soubor pravidel zdravého rozumu je:

  • Použijte TIMESTAMP WITH TIMEZONE (timestamptz) pro ukládání událostí, které souvisejí převážně s "fyzickým" časem , u kterého vás zajímá hlavně dotaz, zda event 1 bylo před event 2 (bez ohledu na časová pásma) nebo počítání časových intervalů (ve „fyzických jednotkách“, např. sekundách; nikoli v „civilních“ jednotkách jako dny-měsíce atd.). Typickým příkladem je čas vytvoření/úpravy záznamu – to, co se obvykle myslí slovem „Časové razítko ".

    ."
  • Použijte TIMESTAMP WITHOUT TIMEZONE (timestamp) pro ukládání událostí, pro které je relevantní informací "občanský čas" (tj. pole {year-month-day hour-min-sec} jako celek) a dotazy zahrnují kalendářní výpočty. V tomto případě byste zde uložili pouze "místní čas", tj. datum a čas vzhledem k nějakému neurčenému (irelevantnímu, nebo implikovanému, nebo uloženému někde jinde) časovému pásmu.

Druhá možnost vám usnadňuje dotazování, řekněme, „všechny události, které se staly dne 2013-01-20“ (v každé odpovídající oblasti/země/časovém pásmu), ale ztěžuje dotazování „všech událostí, které došlo (fyzicky) před referenční událostí“ (pokud nevíme, že jsou ve stejném časovém pásmu). Vy si vyberete.

Pokud potřebujete celou věc, nestačí ani jedno, musíte buď uložit časové pásmo nebo offset do dalšího pole. Další možností, která plýtvá pár bajty, ale může být efektivnější pro dotazy, je uložit obě pole.

Viz také tato odpověď .



  1. Jak seřadit podle maximálně dvou sloupců, které mohou být v MySQL null?

  2. Jak zrušit tabulku, pokud existuje?

  3. Jak mohu zjistit výchozí znakovou sadu/kolování v mém MySQL

  4. Dynamicky vytvořené SQL vs parametry v SQL Server