PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Penanganan zona waktu yang aneh dalam database Postgres

Masalahnya tampaknya tidak terkait dengan Amazon RDS:ini berkaitan dengan konvensi yang digunakan oleh PostgreSQL. Dalam hal ini, Anda melakukan memiliki nama zona waktu ke belakang. Maksud Anda 'UTC-01' tempat Anda menulis 'UTC+01' .
Dari manual :

Jadi string zona waktu digunakan untuk SET TIME ZONE (dan tampilan SHOW timezone , sesuai) atau AT TIME ZONE konstruksi gunakan tanda berlawanan dari apa yang ditampilkan di timestamp (with time zone ) literal! Itu adalah ketidaksepakatan yang sangat disayangkan antara standar ISO dan SQL di satu sisi dan POSIX di sisi lain. (Saya pikir POSIX yang harus disalahkan.) Lihat:

Tapi 'CET' atau 'UTC-01' keduanya masih berpotensi salah untuk Paris karena mereka tidak mengambil aturan untuk waktu musim panas diperhitungkan.
(DST adalah salah satu konsep paling tolol dalam sejarah umat manusia.)

Paris (seperti kebanyakan Eropa) menggunakan CET selama musim dingin dan CEST selama musim panas. Pengujian Anda dengan 'CET' kebetulan kerja di bulan november. Jika Anda mencoba hal yang sama di musim panas, Anda mendapatkan hasil yang salah.

Untuk berjaga-jaga, selalu gunakan nama zona waktu 'Europe/Paris' , yang mempertimbangkan aturan DST. Panggilan lebih mahal.

Fungsi current_time mempertimbangkan aturan DST jika pengaturan zona waktu Anda menyiratkannya. Tapi 'UTC-01' adalah offset waktu biasa. Saya tidak pernah menggunakan tipe data time with time zone atau current_time memulai dengan. Manual sekali lagi:

Pertimbangkan:

SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_winter
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST'   AS cest_summer
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_no_dst  -- CET wrong!
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer
     , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter

Terkait:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara melakukan upsert yang tepat menggunakan sqlalchemy di postgresql?

  2. Cara menghapus postgresql di Mac saya (menjalankan Snow Leopard)

  3. psycopg2.ProgrammingError:kesalahan sintaks pada atau di dekat \

  4. Masalah konkurensi saat mengambil Id dari baris yang baru dimasukkan dengan ibatis

  5. Memperbarui bidang json di Postgres