sql >> Database >  >> RDS >> PostgreSQL

jOOQ Tijdstempel wordt opgeslagen met lokale tijdzone-offset

Helaas werken er een paar dingen tegen je:

  1. Het PostgreSQL JDBC-stuurprogramma stelt de tijdzone in op uw JVM-tijdzone in de Postgres-sessie. Dus zelfs als uw databaseserver in UTC draait, wordt een TIMESTAMP-veld ingevoegd met de tijdzone van uw JVM. Wanneer u gegevens invoert of opvraagt, gebruikt de databaseserver altijd de JVM-tijdzone.
  2. Je gebruikt TIMESTAMP in plaats van TIMESTAMPTZ. De beschrijving van deze typen geeft niet het daadwerkelijke gebruik weer. TIMESTAMPTZ betekent eigenlijk tijdzone-agnostisch. Welke waarde u ook invoert, deze wordt aangepast aan UTC met behulp van de sessietijdzone.

Vanwege deze twee problemen, als je twee verschillende JVM's hebt -- de ene gebruikt de tijd van Los Angeles en de andere gebruikt de tijd van New York -- wanneer je een TIMESTAMP schrijft met de ene JVM, zal het een andere "UTC-tijd" zijn in de andere JVM. TIMESTAMP neemt de aangepaste waarde en gebruikt deze gewoon zoals gegeven. Als u uw TIMESTAMP-kolommen wijzigt in TIMESTAMPTZ, is dezelfde tijd in beide JVM's altijd dezelfde UTC-tijd.

Als u naar de ConnectionFactoryImpl#openConnectionImp van het Postgres JDBC-stuurprogramma kijkt, kunt u zien waar de tijdzone van uw lokale JVM wordt ingesteld als de tijdzone voor de sessiezone van de databaseserver.

Dus de enige verstandige manier om hiermee om te gaan, is door alleen TIMESTAMPTZ te gebruiken in plaats van TIMESTAMP. Hier is wat meer informatie hierover:

PostgreSQL/JDBC en TIMESTAMP vs. TIMESTAMPTZ

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



  1. Wat kan het Queryplan vertellen?

  2. De exacte waarde vinden van een door komma's gescheiden tekenreeks in PHP MySQL

  3. Handleiding voor het gebruik van Sphinx met PHP en MySQL

  4. Mysql-query om domeinen uit URL's te extraheren