Trước hết, bạn nên sử dụng timestamptz
thay vì timestamp
bất cứ khi nào làm việc với nhiều múi giờ. Sẽ tránh được hoàn toàn sự cố.
Chi tiết:
Bạn có thể sử dụng AT TIME ZONE
xây dựng như @NuLo đề xuất
, nó có thể thậm chí hoạt động, nhưng không chính xác như mô tả.
AT TIME ZONE
chuyển đổi loại timestamp
(timestamp without time zone
) thành timestamptz
(timestamp with time zone
) và ngược lại. Biểu diễn văn bản của một timestamptz
giá trị phụ thuộc vào cài đặt hiện tại múi giờ trong phiên mà bạn chạy lệnh. Hai timestamptz
này giá trị giống nhau 100% (biểu thị cùng một thời điểm):
'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
Nhưng phần trình bày văn bản thì không . Màn hình hiển thị cho các múi giờ khác nhau. Nếu bạn lấy chuỗi này theo nghĩa đen và đưa nó vào timestamp
nhập, phần múi giờ chỉ bị bỏ qua và bạn kết thúc với khác nhau các giá trị. Do đó, nếu bạn chạy COPY
của mình tuyên bố trong một phiên có cài đặt múi giờ giống như timestamp
ban đầu của bạn các giá trị dành cho, hoạt động được đề xuất xảy ra để làm việc.
Tuy nhiên, cách rõ ràng là tạo đúng timestamp
bắt đầu bằng cách áp dụng AT TIME ZONE
hai lần :
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
'my_target_tz'
là "múi giờ của riêng bạn" và 'my_source_tz'
múi giờ của máy chủ đám mây trong ví dụ. Để đảm bảo rằng DST được tôn trọng, hãy sử dụng tên múi giờ , không phải chữ viết tắt của múi giờ. Tài liệu:
Có liên quan:
- Tính toán DST trong Postgres, khi chọn các mục đã lên lịch
- Tên múi giờ có thuộc tính giống hệt nhau mang lại kết quả khác khi áp dụng cho dấu thời gian
Hoặc, tốt hơn nữa, hãy sử dụng timestamptz
ở mọi nơi và nó hoạt động tự động một cách chính xác.