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

Geografisk spredte servere, PostgreSQL og JPA

Løsningen er at bruge TIMESTAMPTZ-felter til disse øjeblikke i tid. Noget som "hvornår blev brugeren oprettet" bør aldrig gemmes med et TIMESTAMP-felt, da det som standard ikke indeholder TZ-oplysninger. JDBC-driveren håndterer disse ganske vilkårligt. Overvej f.eks. følgende:

Antag, at din JVM er i America/Los_Angeles-zonen, mens din databaseserver er i UTC.

Opret derefter følgende tabel:

 CREATE TABLE test (
   id   INTEGER,
   ts   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
 );

Hvis du udsteder fra PSQL:

 INSERT INTO test(id) values(1);

Du vil få identiske værdier for "ts" og "tswz". Begge vil være den aktuelle UTC-tid. Men hvis du udfører den SAMME EKSAKTE forespørgsel fra Java ved hjælp af JDBC-driveren, vil "ts" være det aktuelle tidspunkt i Los Angeles og "tswz" vil være UTC-tiden.

Jeg ved ikke, HVORDAN driveren sender JVM-tidszonen til serveren i dette tilfælde, fordi vi er standard på feltet på serveren. De siger, at de ikke indstiller tidszonen for sessionen, men det skal de. Uanset hvad, hvis du bruger et TIMESTAMPTZ-felt, vil du få de samme øjeblikke fra enhver JVM, uanset hvilken tidszone den tilfældigvis er i.




  1. Oracle flere felter i Vælg IN Parameter

  2. SELECT INTO OUTFILE tilladelse nægtet, men brugeren kan skrive til mappen

  3. Kald til en medlemsfunktion addEagerConstraints() på float LARAVEL

  4. ugyldig værdi for parameter, 'katalog'