sql >> Database >  >> RDS >> PostgreSQL

JPA-modelklasse voor veld TIMESTAMP ZONDER TIJDZONE DEFAULT CURRENT_TIMESTAMP in Postgres?

Verkeerd type

LocalDateTime is hier het verkeerde type. Die klasse kan geen moment vertegenwoordigen, zoals uitgelegd in zijn Javadoc.

Die klasse heeft met opzet geen concept van tijdzone of offset-van-UTC. Het vertegenwoordigt dus een datum en een tijd van de dag, zoals "middag op 23 januari 2019", maar weet niet of dat de middag is in bijvoorbeeld Tokio, Parijs of Montréal, drie heel verschillende momenten die liggen enkele uren uit elkaar. Dit type is dus geschikt voor het standaard SQL-type TIMESTAMP WITHOUT TIME ZONEzonder , niet met .

Zie voor meer discussie:Wat is het verschil tussen Instant en LocalDateTime?

Juiste type

Voor standaard SQL-type TIMESTAMP WITH TIME ZONE , moet u de Java-typen Instant . gebruiken , OffsetDateTime , of ZonedDateTime . Van deze drie vereist JDBC 4.2 alleen ondersteuning voor de tweede, OffsetDateTime .

Ophalen.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

De waarde die uit Postgres wordt opgehaald, is altijd in UTC. De SQL-standaard specificeert dit gedrag niet, dus databases variëren. In Postgres is elke waarde verzonden naar een veld van het type TIMESTAMP WITH TIME ZONE wordt aangepast in UTC. Opgehaalde waarden zijn in UTC.

Opslaan.

myPreparedStatement.setObject( … , odt ) ;

Pas aan van UTC (offset van nul) naar de wandkloktijd die wordt gebruikt door de mensen in een bepaalde regio (een tijdzone).

ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

JPA

Ik gebruik geen JPA, ik houd het liever simpel.

Maar volgens dit antwoord , JPA 2.2 ondersteunt de java.time soorten.

Hibernate ondersteunt ook java.time .




  1. MySQL &PHP decimale precisie verkeerd

  2. Verschil tussen gelezen vastgelegd en herhaalbaar gelezen

  3. SUM met een spil om de algemene score te berekenen

  4. DATEDIFF() of BETWEEN voor datumbereiken in SQL-query's