Pertama-tama, Anda harus menggunakan timestamptz
bukannya timestamp
setiap kali bekerja dengan beberapa zona waktu. Akan menghindari masalah sepenuhnya.
Detail:
Anda bisa gunakan AT TIME ZONE
membangun seperti @NuLo menyarankan
, itu mungkin bahkan berfungsi, tetapi tidak persis seperti yang dijelaskan.
AT TIME ZONE
mengonversi tipe timestamp
(timestamp without time zone
) ke timestamptz
(timestamp with time zone
) dan sebaliknya. Representasi teks dari timestamptz
nilainya tergantung pada pengaturan saat ini zona waktu di sesi di mana Anda menjalankan perintah. Kedua timestamptz
nilai 100% identik (menunjukkan titik waktu yang sama):
'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
Tapi representasi teksnya tidak . Tampilannya untuk zona waktu yang berbeda. Jika Anda mengambil string ini secara literal dan memasukkannya ke timestamp
ketik, bagian zona waktu diabaikan dan Anda berakhir dengan berbeda nilai-nilai. Karenanya, jika Anda menjalankan COPY
pernyataan dalam sesi dengan pengaturan zona waktu yang sama dengan timestamp
asli Anda nilai untuk, operasi yang disarankan terjadi untuk bekerja.
Namun, cara bersihnya adalah menghasilkan timestamp
yang benar nilai untuk memulai dengan menerapkan AT TIME ZONE
dua kali :
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
'my_target_tz'
adalah "zona waktu Anda sendiri" dan 'my_source_tz'
zona waktu server cloud dalam contoh. Untuk memastikan bahwa DST dihormati, gunakan nama zona waktu , bukan singkatan zona waktu. Dokumentasi:
Terkait:
- Menghitung DST di Postgres, saat memilih item terjadwal
- Nama zona waktu dengan properti yang identik menghasilkan hasil yang berbeda saat diterapkan pada stempel waktu
Atau, jauh lebih baik lagi, gunakan timestamptz
di mana-mana dan bekerja dengan benar secara otomatis.