sql >> Databasteknik >  >> RDS >> PostgreSQL

Ska jag lagra tidszonen separat från tidsstämpeln för Postgres och JDBC?

När du lagrar en timestamp with time zone (timestamptz ) den konverteras till UTC för lagring i DB. När den hämtas omvandlas den till klientens aktuella tidszon, inte den tidszon den ursprungligen var i. Det är i princip en tidpunkt.

Det finns också timestamp without time zone (timestamp ). Detta är inte föremål för konvertering, men gör det inte bär en tidsstämpel med sig. Om du lagrar en timestamp med din klienttidszon inställd på UTC och hämta den sedan när klientens tidszon är '+08:00' får du samma värde. Det är hälften av vad du vill ha, eftersom det bevarar det råa tidsvärdet.

Namnen och beteenden är hemska och förvirrande, men ställs in av SQL-standarden.

Du måste lagra tidszonen separat om du vill spela in en tidpunkt i en viss tidszon. Jag rekommenderar att du lagrar det som ett INTERVAL med en CHECK begränsning som begränsar det till att vara colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Den definitionen förkastar -12:00 och accepterar +12:00; Jag är inte helt säker på att det stämmer, så kolla.

Du kan antingen lagra timestamp lokal tid i den tidszonen (vad jag förmodligen skulle göra) eller lagra timestamptz av UTC-tiden när händelsen inträffade plus en offset som låter dig konvertera den till lokal tid.

Båda kommer att fungera bra för JDBC. För JPA beror det på hur väl din leverantör förstår och kartlägger intervalltyper. Helst vill du ha ett övergående genererat fält i din enhet som rekonstruerar den kalenderinstans du vill använda med timestamp och interval lagras i databasen.



  1. psycopg2 mapping Python:lista över dicts till Postgres:array av sammansatt typ för en INSERT-sats

  2. Hur skickar man ett värde från android till php-webbtjänst och hämtar det?

  3. Fråga MSQL för vinnare, börja på xth plats med SELECT

  4. Postgres-fel vid uppdatering av kolumndata