sql >> Databáze >  >> RDS >> Mysql

Pole Jooq LocalDateTime používají systémové časové pásmo místo časového pásma relace

Nedávno jsem zjistil, že v závislosti na používaném ovladači databáze může jOOQ vykazovat nějaké podivné chování při analýze DateTime. jOOQ vrací posunutý čas jako Z (UTC), i když tomu tak není

Konkrétně v mém případě použití jiného ovladače Postgres vedlo k tomu, že DefaultBinding.java obdrží objekt kalendáře, který má časové razítko, ale zavolá na něj toString za účelem analýzy. Ukázalo se, že toString nevytiskne časové pásmo, pak jOOQ odvodil, že to bylo v místním čase.

Pro mě byly problematické řádky v DefaultBinding.java (používal jsem časové razítko s časovým pásmem):

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

Můžete být na jiné lince v této řadě else ifs na základě toho, že nemáte časové pásmo.

Při mém testování jsem také zjistil, že změna systémového času změnila výsledek, ale změna času relace nic neudělala.

Naštěstí pro mě problém vyřešil přechod na standardní ovladač Postgres. Pokud by tomu tak nebylo, chtěl jsem se podívat na přetížení vazby pro OffsetDateTime, abych opravil použití toString a s ním spojené odstranění příslušného časového pásma. Možná budete muset pokračovat touto cestou, bohužel, pokud také nepoužíváte ovladač SQL, který by mohl být upgradován nebo nahrazen. Nebo jej můžete uložit s časovým pásmem a poté jej převést na požadované časové pásmo při načítání z databáze.




  1. Jaký typ MySQL je nejvhodnější pro sloupec ceny?

  2. Přístup k WordPressu

  3. Jak identifikovat neplatné (poškozené) hodnoty uložené ve sloupcích Oracle DATE

  4. Jedna nebo více databází na kontejner Docker