PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lớp mô hình JPA cho trường TIMESTAMP KHÔNG CÓ KHU VỰC THỜI GIAN DEFAULT CURRENT_TIMESTAMP trong Postgres?

Loại sai

LocalDateTime là loại sai ở đây. Lớp đó không thể đại diện cho một thời điểm, như đã giải thích trong Javadoc của nó.

Lớp đó cố tình không có khái niệm về múi giờ hoặc khoảng thời gian bù trừ từ UTC. Vì vậy, nó đại diện cho một ngày và một giờ trong ngày, chẳng hạn như "trưa ngày 23 tháng 1 năm 2019", nhưng không biết liệu đó có phải là buổi trưa ở Tokyo, Paris hay Montréal không, chẳng hạn như ba thời điểm rất khác nhau cách nhau vài giờ. Vì vậy, kiểu này thích hợp cho kiểu SQL tiêu chuẩn TIMESTAMP WITHOUT TIME ZONE - không có , không với .

Để thảo luận thêm, hãy xem: Sự khác biệt giữa Instant và LocalDateTime là gì?

Đúng loại

Đối với kiểu SQL tiêu chuẩn TIMESTAMP WITH TIME ZONE , bạn nên sử dụng các loại Java Instant , OffsetDateTime hoặc ZonedDateTime . Trong số ba thứ đó, JDBC 4.2 chỉ yêu cầu hỗ trợ cho phần thứ hai, OffsetDateTime .

Truy xuất.

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

Giá trị được truy xuất từ ​​Postgres sẽ luôn ở UTC. Tiêu chuẩn SQL không chỉ định hành vi này, do đó, cơ sở dữ liệu khác nhau. Trong Postgres bất kỳ giá trị nào được gửi đến một trường thuộc loại TIMESTAMP WITH TIME ZONE được điều chỉnh thành UTC. Các giá trị được truy xuất tính theo giờ UTC.

Lưu trữ.

myPreparedStatement.setObject( … , odt ) ;

Điều chỉnh từ UTC (chênh lệch 0) thành thời gian trên đồng hồ treo tường được sử dụng bởi người dân của một khu vực cụ thể (một múi giờ).

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

JPA

Tôi không sử dụng JPA, tôi thích đơn giản hóa mọi thứ.

Nhưng theo Câu trả lời này , JPA 2.2 hỗ trợ java.time các loại.

Hibernate cũng hỗ trợ java.time .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao một số nhận dạng trong TẠO BẢNG được dấu ngoặc kép mà không phải là những số khác?

  2. String_agg cho nhiều cột

  3. Buộc Liquibase ánh xạ Blob tới BYTEA trên PostgreSQL

  4. Làm thế nào để khôi phục dataframe.to_sql trong python trong SQLAlchemy?

  5. cách tính thời gian giữa hai dấu thời gian (PostgreSQL)