sql >> Database >  >> RDS >> Mysql

Jooq LocalDateTime-velden gebruiken systeemtijdzone in plaats van sessietijdzone

Ik heb onlangs ontdekt dat, afhankelijk van het databasestuurprogramma dat wordt gebruikt, jOOQ vreemd gedrag kan vertonen bij het ontleden van DateTime. jOOQ retourneert offset datum tijd als Z (UTC) ook al is dat niet het geval

In mijn geval resulteerde het gebruik van een ander Postgres-stuurprogramma erin dat DefaultBinding.java een kalenderobject ontving dat een tijdstempel heeft, maar er toString op aanroept om te ontleden. Blijkt dat toString de tijdzone niet afdrukt, waarna jOOQ concludeerde dat het in lokale tijd was.

Voor mij waren de aanstootgevende regels in DefaultBinding.java (ik gebruikte een tijdstempel met tijdzone):

else if (type == OffsetDateTime.class) {
    result = (T) offsetDateTime(ctx.resultSet().getString(ctx.index()));
}

Het kan zijn dat je op een andere lijn zit in die reeks van else ifs, omdat je geen tijdzone hebt.

Tijdens mijn testen ontdekte ik ook dat het veranderen van de systeemtijd het resultaat veranderde, maar het veranderen van de sessietijd deed niets.

Gelukkig voor mij loste een overstap naar de standaard Postgres-driver het probleem op. Als dat niet het geval was, zou ik kijken naar het overbelasten van de binding voor OffsetDateTime om het gebruik van toString en het bijbehorende strippen van de relevante tijdzone te herstellen. Het kan zijn dat u dat pad moet volgen, helaas, tenzij u ook een SQL-stuurprogramma gebruikt dat kan worden geüpgraded of vervangen. Of u kunt het opslaan met een tijdzone en vervolgens converteren naar de gewenste tijdzone wanneer u het uit de database laadt.




  1. Converteren van DateTime naar INT

  2. mysql selecteren met while-lus

  3. hoe het tijdstempelformaat in mysql te veranderen

  4. PostgreSQL-logboekanalyse met pgBadger