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

Mám ukládat časové pásmo odděleně od časového razítka pro Postgres a JDBC?

Když uložíte timestamp with time zone (timestamptz ) je převeden na UTC pro uložení v DB. Po načtení se převede na aktuální časové pásmo klienta, nikoli na časové pásmo, ve kterém byl původně. Jde v podstatě o časový bod.

K dispozici je také timestamp without time zone (timestamp ). Toto není předmětem konverze, ale není noste s sebou časové razítko. Pokud uložíte timestamp s časovým pásmem klienta nastaveným na UTC a poté jej načtěte, když je časové pásmo klienta '+08:00', získáte stejnou hodnotu. To je polovina toho, co chcete, protože zachovává nezpracovanou časovou hodnotu.

Názvy a chování jsou hrozné a matoucí, ale jsou nastaveny standardem SQL.

Časové pásmo musíte uložit samostatně, chcete-li zaznamenat bod v čase v určitém časovém pásmu. Doporučuji jej uložit jako INTERVAL s CHECK omezení, které jej omezuje na colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Tato definice odmítá -12:00 a přijímá +12:00; Nejsem si úplně jistý, že je to správné, tak to zkontrolujte.

Můžete uložit timestamp místního času v daném časovém pásmu (co bych asi udělal já), nebo uložit timestamptz času UTC, kdy k události došlo, plus posun, který vám umožní převést jej na místní čas.

Obojí bude fungovat dobře pro JDBC. U JPA bude záležet na tom, jak dobře váš poskytovatel rozumí a mapuje typy intervalů. V ideálním případě chcete ve své entitě přechodně generované pole, které rekonstruuje požadovanou instanci Kalendáře pomocí timestamp a interval uloženy v databázi.



  1. Dotazování na datový typ Oracle Clob

  2. Jak předefinovat sloupce vrácené uloženou procedurou na serveru SQL Server

  3. Skryté pole Data se nevkládají do Mysql

  4. Jak volat uloženou proceduru v Entity Framework Core se vstupními a výstupními parametry pomocí mysql