Khi bạn lưu trữ timestamp with time zone
(timestamptz
) nó được chuyển đổi thành UTC để lưu trữ trong DB. Khi được truy xuất, nó được chuyển đổi thành múi giờ hiện tại của khách hàng, không phải múi giờ ban đầu. Về cơ bản, đó là một thời điểm.
Ngoài ra còn có timestamp without time zone
(timestamp
). Điều này không phụ thuộc vào chuyển đổi, nhưng không không mang theo một dấu thời gian với nó. Nếu bạn lưu trữ timestamp
với múi giờ khách hàng của bạn được đặt thành UTC, sau đó truy xuất nó khi múi giờ khách hàng là '+08:00', bạn sẽ nhận được cùng một giá trị. Đó là một nửa những gì bạn muốn, trong đó nó bảo toàn giá trị thời gian thô.
Các tên và hành vi rất khủng khiếp và khó hiểu, nhưng được đặt theo tiêu chuẩn SQL.
Bạn phải lưu trữ múi giờ riêng biệt nếu bạn muốn ghi lại một điểm trong thời gian tại một múi giờ cụ thể. Tôi khuyên bạn nên lưu trữ nó dưới dạng INTERVAL
với CHECK
ràng buộc giới hạn nó là colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Định nghĩa đó bác bỏ -12:00 và chấp nhận +12:00; Tôi không hoàn toàn chắc chắn điều đó là đúng, vì vậy hãy kiểm tra.
Bạn có thể lưu trữ timestamp
của giờ địa phương tại múi giờ đó (điều tôi có thể làm) hoặc lưu trữ timestamptz
của giờ UTC khi sự kiện xảy ra cộng với khoảng thời gian bù cho phép bạn chuyển đổi nó thành giờ địa phương.
Một trong hai sẽ hoạt động tốt cho JDBC. Đối với JPA, nó sẽ phụ thuộc vào mức độ hiểu của nhà cung cấp của bạn và ánh xạ các loại khoảng thời gian. Lý tưởng nhất là bạn muốn một trường được tạo tạm thời trong thực thể của mình để cấu trúc lại phiên bản Lịch mà bạn muốn bằng cách sử dụng timestamp
và interval
được lưu trữ trong cơ sở dữ liệu.