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

jOOQ Tidsstempel gemmes med lokal tidszoneforskydning

Desværre har du et par ting, der virker imod dig:

  1. PostgreSQL JDBC-driveren indstiller tidszonen til din JVM-tidszone i Postgres-sessionen. Så selvom din databaseserver kører i UTC, vil et TIMESTAMP-felt blive indsat ved hjælp af tidszonen på din JVM. Når du indsætter eller forespørger data, vil databaseserveren altid bruge JVM-tidszonen.
  2. Du bruger TIMESTAMP i stedet for TIMESTAMPTZ. Beskrivelsen af ​​disse typer afspejler ikke deres faktiske brug. TIMESTAMPTZ betyder faktisk tidszone agnostiker. Uanset hvilken værdi du indsætter, vil den blive justeret til UTC ved hjælp af sessionens tidszone.

På grund af disse to problemer, hvis du har to forskellige JVM'er -- den ene bruger Los Angeles tid og den anden bruger New York tid -- hver gang du skriver et TIMESTAMP med en JVM vil det være en anden "UTC tid" i den anden JVM. TIMESTAMP tager den justerede værdi og bruger den som givet. Hvis du ændrer dine TIMESTAMP-kolonner til TIMESTAMPTZ, vil den samme tid i begge JVM'er altid være den samme UTC-tid.

Hvis du ser på Postgres JDBC-driverens ConnectionFactoryImpl#openConnectionImp, kan du se, hvor den indstiller din lokale JVM's tidszone som tidszone for databaseserverens sessionszone.

Så den eneste fornuftige måde at håndtere dette på er kun at bruge TIMESTAMPTZ i stedet for TIMESTAMP. Her er nogle flere oplysninger om dette:

PostgreSQL/JDBC og TIMESTAMP vs. TIMESTAMPTZ

http://justatheory.com/computers/databases/postgresql/use-timestamptz .html



  1. Sammenføjning af InnoDB-tabeller med MyISAM-tabeller

  2. mysql henter alle rækker, mens der også bruges oversigter

  3. MySQL DROP DATABASE Privilegium?

  4. Simulering af CONNECT BY PRIOR af Oracle i SQL Server