sql >> Databasteknik >  >> RDS >> PostgreSQL

JPA-modellklass för fält TIMESTAMP UTAN TIDZON STANDARD CURRENT_TIMESTAMP i Postgres?

Fel typ

LocalDateTime är fel typ här. Den klassen kan inte representera ett ögonblick, som förklaras i dess Javadoc.

Den klassen har avsiktligt inget begrepp om tidszon eller offset-från-UTC. Så det representerar ett datum och en tid på dagen som "middag den 23 januari 2019", men vet inte om det är middag i Tokyo, Paris eller Montréal, till exempel, tre väldigt olika ögonblick som det är flera timmars mellanrum. Så den här typen är lämplig för standard SQL-typ TIMESTAMP WITHOUT TIME ZONEutan , inte med .

För mer diskussion, se:Vad är skillnaden mellan Instant och LocalDateTime?

Rätt typ

För standard SQL-typ TIMESTAMP WITH TIME ZONE , bör du använda Java-typerna Instant , OffsetDateTime , eller ZonedDateTime . Av dessa tre kräver JDBC 4.2 stöd endast för den andra, OffsetDateTime .

Hämtning.

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

Värdet som hämtas från Postgres kommer alltid att vara i UTC. SQL-standarden anger inte detta beteende, så databaserna varierar. I Postgres skickas alla värden till ett fält av typen TIMESTAMP WITH TIME ZONE justeras till UTC. Hämtade värden är i UTC.

Lagring.

myPreparedStatement.setObject( … , odt ) ;

Justera från UTC (offset av noll) till väggklockan som används av människorna i en viss region (en tidszon).

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

JPA

Jag använder inte JPA, föredrar att hålla saker och ting enkla.

Men enligt det här svaret , JPA 2.2 stöder java.time typer.

Hibernate stöder också java.time .




  1. beräkna summan av alla siffror i en kolumn

  2. SQL Server – När ska man använda Clustered vs non-Clustered Index?

  3. Är det möjligt att flytta kolumndata nedåt i en MySQL-tabell?

  4. Vad står TX- och XID-fraktioner för i postgres pgadmin-verktyget