sql >> Database teknologi >  >> RDS >> PostgreSQL

Skal jeg gemme tidszonen adskilt fra tidsstemplet for Postgres og JDBC?

Når du gemmer et timestamp with time zone (timestamptz ) den konverteres til UTC til lagring i DB. Når den hentes, konverteres den til klientens aktuelle tidszone, ikke den tidszone, den oprindeligt var i. Det er grundlæggende et tidspunkt.

Der er også timestamp without time zone (timestamp ). Dette er ikke genstand for konvertering, men ikke bære et tidsstempel med sig. Hvis du gemmer et timestamp med din klienttidszone sat til UTC, og hent den derefter, når klientens tidszone er '+08:00', får du den samme værdi. Det er det halve, du ønsker, i og med at det bevarer den rå tidsværdi.

Navnene og adfærden er forfærdelige og forvirrende, men sat af SQL-standarden.

Du skal gemme tidszonen separat, hvis du ønsker at optage et tidspunkt i en bestemt tidszone. Jeg vil anbefale, at du gemmer det som et INTERVAL med en CHECK begrænsning, der begrænser det til at være colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR . Denne definition afviser -12:00 og accepterer +12:00; Jeg er ikke helt sikker på, at det er rigtigt, så tjek det.

Du kan enten gemme timestamp af lokal tid i den tidszone (hvad jeg sandsynligvis ville gøre), eller gemme timestamptz af UTC-tiden, hvor hændelsen fandt sted, plus en offset, der lader dig konvertere den til lokal tid.

Begge vil fungere fint for JDBC. For JPA vil det afhænge af, hvor godt din udbyder forstår og kortlægger intervaltyper. Ideelt set vil du have et forbigående genereret felt i din enhed, der rekonstruerer den kalenderforekomst, du ønsker, ved hjælp af timestamp og interval gemt i databasen.



  1. Kryptere med PHP Mcrypt og dekryptere med MySQL aes_decrypt?

  2. MySql:Multiple Left Join giver forkert output

  3. Bulk Record Update med SQL

  4. vælg duplikeret post og tæl post fra kommasepareret i mysql