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.