sql >> Databasteknik >  >> RDS >> PostgreSQL

jOOQ Tidsstämpel lagras med lokal tidszonförskjutning

Tyvärr har du några saker mot dig:

  1. PostgreSQL JDBC-drivrutinen ställer in tidszonen till din JVM-tidszon i Postgres-sessionen. Så även om din databasserver körs i UTC kommer ett TIMESTAMP-fält att infogas med tidszonen för din JVM. När du infogar eller frågar efter data kommer databasservern alltid att använda JVM-tidszonen.
  2. Du använder TIMESTAMP istället för TIMESTAMPTZ. Beskrivningen av dessa typer återspeglar inte deras faktiska användning. TIMESTAMPTZ betyder egentligen tidszon agnostiker. Oavsett vilket värde du anger kommer det att justeras till UTC med sessionens tidszon.

På grund av dessa två problem, om du har två olika JVM - en med Los Angeles-tid och den andra använder New York-tid - när du skriver en TIDSTÄMPEL med en JVM blir det en annan "UTC-tid" i den andra JVM. TIMESTAMP tar det justerade värdet och använder det bara som givet. Om du ändrar dina TIMESTAMP-kolumner till TIMESTAMPTZ kommer samma tid i båda JVM alltid att vara samma UTC-tid.

Om du tittar på Postgres JDBC Driver's ConnectionFactoryImpl#openConnectionImp kan du se var den ställer in din lokala JVM:s tidszon som tidszon för databasserverns sessionszon.

Så det enda vettiga sättet att hantera detta är att bara använda TIMESTAMPTZ istället för TIMESTAMP. Här är lite mer information om detta:

PostgreSQL/JDBC och TIMESTAMP vs. TIMESTAMPTZ

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



  1. MySQL vs. JSON - Varför?

  2. Ett bättre sätt att generera denna json-array från MySql-data med php

  3. Hur väljer man en <select>-sats från databasen?

  4. SQL Server varbinary bigint med BitConverter.ToInt64-värden är olika