sql >> Databáze >  >> RDS >> PostgreSQL

Třída modelu JPA pro pole TIMESTAMP BEZ VÝCHOZÍHO VÝCHODU ČASOVÉHO PÁSMA CURRENT_TIMESTAMP v Postgresu?

Špatný typ

LocalDateTime je zde špatný typ. Tato třída nemůže představovat okamžik, jak je vysvětleno v jejím Javadoc.

Tato třída záměrně nemá žádnou koncepci časového pásma nebo offsetu od-UTC. Představuje tedy datum a denní dobu jako „poledne 23. ledna 2019“, ale nevím, jestli je to poledne například v Tokiu, Paříži nebo Montrealu, tři velmi odlišné okamžiky, které jsou od sebe několik hodin. Tento typ je tedy vhodný pro standardní SQL typ TIMESTAMP WITHOUT TIME ZONEbez , nikoli s .

Další diskusi najdete na:Jaký je rozdíl mezi Instant a LocalDateTime?

Správný typ

Pro standardní SQL zadejte TIMESTAMP WITH TIME ZONE , měli byste používat Java typy Instant , OffsetDateTime nebo ZonedDateTime . Z těchto tří vyžaduje JDBC 4.2 podporu pouze pro druhý, OffsetDateTime .

Získávání.

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

Hodnota získaná z Postgres bude vždy v UTC. Standard SQL toto chování nespecifikuje, takže databáze se liší. V Postgresu jakákoliv hodnota odeslaná do pole typu TIMESTAMP WITH TIME ZONE se upraví do UTC. Načtené hodnoty jsou v UTC.

Ukládání.

myPreparedStatement.setObject( … , odt ) ;

Upravte z UTC (posun nuly) na čas nástěnných hodin používaný lidmi v určité oblasti (časové pásmo).

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

JPA

Nepoužívám JPA, raději věci zjednoduším.

Ale podle této odpovědi , JPA 2.2 podporují java.time typy.

Hibernate také podporuje java.time .




  1. Přidejte identity AppPool IIS 7 jako přihlášení k serveru SQL

  2. Připojovací řetězec SqlAlchemy

  3. Získávání nekompatibilního kódování znaků:Chyba UTF-8 a ASCII-8BIT při zobrazení uživatelem zadaného znaku ASCII-8BIT

  4. Vytvoření dočasné tabulky uvnitř uložené procedury