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

JPA Model Class for felt TIMESTAMP UDEN TIDSZONE STANDARD CURRENT_TIMESTAMP i Postgres?

Forkert type

LocalDateTime er den forkerte type her. Den klasse kan ikke repræsentere et øjeblik, som forklaret i dens Javadoc.

Denne klasse har med vilje ikke noget begreb om tidszone eller offset-fra-UTC. Så det repræsenterer en dato og et tidspunkt på dagen såsom "middag den 23. januar 2019", men ved ikke, om det er middag i Tokyo, Paris eller Montréal, for eksempel tre meget forskellige øjeblikke, der er flere timers mellemrum. Så denne type er passende til standard SQL-typen TIMESTAMP WITHOUT TIME ZONEuden , ikke med .

For mere diskussion, se:Hvad er forskellen mellem Instant og LocalDateTime?

Ret type

For standard SQL-type TIMESTAMP WITH TIME ZONE , bør du bruge Java-typerne Instant , OffsetDateTime , eller ZonedDateTime . Af disse tre kræver JDBC 4.2 kun understøttelse af den anden, OffsetDateTime .

Hentning.

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

Værdien hentet fra Postgres vil altid være i UTC. SQL-standarden angiver ikke denne adfærd, så databaser varierer. I Postgres sendes enhver værdi til et felt af typen TIMESTAMP WITH TIME ZONE justeres til UTC. Hentede værdier er i UTC.

Opbevaring.

myPreparedStatement.setObject( … , odt ) ;

Juster fra UTC (offset af nul) til vægurstiden, der bruges af befolkningen i en bestemt region (en tidszone).

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

JPA

Jeg bruger ikke JPA, og foretrækker at holde tingene enkle.

Men ifølge dette svar , JPA 2.2 understøtter java.time typer.

Hibernate understøtter også java.time .




  1. Affyr en trigger efter opdatering af specifikke kolonner i MySQL

  2. Tillad kun indsættelse fra en trigger

  3. Mysql-optimering baseret på forklaring

  4. Sådan gemmer du JSON-data i MySQL