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

Tanggal PostgreSQL() dengan zona waktu

Pada dasarnya yang Anda inginkan adalah:

$ select starts_at AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific' from schedules where id = 40

Saya mendapat solusinya dari artikel di bawah ini, yaitu EMAS lurus!!! Ini menjelaskan masalah non-sepele ini dengan sangat jelas, bacalah jika Anda ingin memahami manajemen pstgrsql TZ dengan lebih baik.

Mengekspresikan cap waktu PostgreSQL tanpa zona dalam waktu lokal

Inilah yang sedang terjadi. Pertama, Anda harus tahu bahwa 'zona waktu PST adalah 8 jam di belakang zona waktu UTC jadi misalnya 1 Jan 2014, 16:30 PST (Rabu, 01 Jan 2014 16:00:30 -0800) sama dengan 2 Jan 2014, 00:30 AM UTC (Kamis, 02 Jan 2014 00:00:30 +0000). Setiap saat setelah pukul 16:00 di PST akan digeser ke hari berikutnya, ditafsirkan sebagai UTC.

Juga, seperti yang disebutkan Erwin Brandstetter di atas, postresql memiliki dua jenis tipe data cap waktu, satu dengan zona waktu dan satu tanpa. Jika cap waktu Anda menyertakan zona waktu, maka sederhana:

$ select starts_at AT TIME ZONE 'US/Pacific' from schedules where id = 40

akan bekerja. Namun jika stempel waktu Anda tanpa zona waktu, menjalankan perintah di atas tidak akan berfungsi, dan Anda harus PERTAMA mengonversi stempel waktu tanpa zona waktu Anda menjadi stempel waktu dengan zona waktu, yaitu zona waktu UTC, dan HANYA KEMUDIAN mengonversinya ke 'PST' atau 'AS/' yang Anda inginkan Pacific' (yang sama hingga beberapa masalah waktu musim panas. Saya pikir Anda harus baik-baik saja dengan keduanya).

Biarkan saya menunjukkan dengan contoh di mana saya membuat stempel waktu tanpa zona waktu. Mari kita asumsikan untuk kenyamanan bahwa zona waktu lokal kita memang 'PST' (jika tidak maka akan sedikit lebih rumit yang tidak diperlukan untuk tujuan penjelasan ini).

Katakanlah saya punya:

$ select timestamp '2014-01-2 00:30:00' AS a, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'UTC' AS b,  timestamp '2014-01-2 00:30:00' AT TIME ZONE 'UTC' AT TIME ZONE 'PST' AS c, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d

Ini akan menghasilkan:

"a"=>"2014-01-02 00:30:00"   (This is the timezoneless timestamp)
"b"=>"2014-01-02 00:30:00+00" (This is the UTC TZ timestamp, note that up to a timezone, it is equivalent to the timezoneless one)
"c"=>"2014-01-01 16:30:00" (This is the correct 'PST' TZ conversion of the UTC timezone, if you read the documentation postgresql will not print the actual TZ for this conversion)
"d"=>"2014-01-02 08:30:00+00"

Stempel waktu terakhir adalah alasan untuk semua kebingungan tentang mengubah stempel waktu tanpa zona waktu dari UTC ke 'PST' di postgresql. Saat kita menulis:

timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d

Kami mengambil stempel waktu tanpa zona waktu dan mencoba mengubahnya menjadi 'PST TZ (kami secara tidak langsung berasumsi bahwa postgresql akan mengerti bahwa kami ingin mengubah stempel waktu dari UTC TZ, tetapi postresql memiliki rencana sendiri!). Dalam praktiknya, yang dilakukan postgresql adalah mengambil stempel waktu tanpa zona waktu ('2014-01-2 00:30:00) dan memperlakukannya seolah-olah itu SUDAH stempel waktu TZ 'PST' (yaitu:01-02-2014 00:30 :00 -0800) dan mengubahnya menjadi zona waktu UTC!!! Jadi itu benar-benar mendorongnya 8 jam ke depan, bukan ke belakang! Jadi kita dapatkan (2014-01-02 08:30:00+00).

Bagaimanapun, perilaku terakhir (tidak intuitif) ini adalah penyebab semua kebingungan. Baca artikel jika Anda ingin penjelasan yang lebih menyeluruh, saya sebenarnya mendapatkan hasil yang sedikit berbeda dari mereka di bagian terakhir ini, tetapi ide umumnya sama.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Statistik cakupan kode

  2. Penggabungan Koneksi dengan Pgbouncer di PostgreSQL 9.0

  3. Bisakah PostgreSQL memiliki batasan keunikan pada elemen array?

  4. Casting tipe NULL saat memperbarui beberapa baris

  5. Hari Pengembang PostgreSQL Praha 2016