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

Dapatkan waktu dengan zona waktu dari waktu tanpa zona waktu dan nama zona waktu

PERINGATAN:Pemula PostgreSQL (lihat komentar pada pertanyaan!). Saya tahu sedikit tentang zona waktu, jadi saya tahu apa yang masuk akal untuk bertanya.

Sepertinya saya ini pada dasarnya adalah situasi yang tidak didukung (sayangnya) ketika datang ke AT TIME ZONE . Melihat AT TIME ZONE dokumentasi itu memberikan tabel di mana tipe nilai "input" hanya:

  • stempel waktu tanpa zona waktu
  • stempel waktu dengan zona waktu
  • waktu dengan zona waktu

Kami kehilangan yang Anda inginkan:waktu tanpa zona waktu. Yang Anda tanyakan adalah agak logis, meskipun itu tergantung pada tanggal ... karena zona waktu yang berbeda dapat memiliki offset yang berbeda tergantung pada tanggal. Misalnya, 12:00:00 Eropa/London mungkin berarti 12:00:00 UTC, atau mungkin berarti 11:00:00 UTC, tergantung apakah saat itu musim dingin atau musim panas.

Di sistem saya, setelah mengatur zona waktu sistem ke Amerika/Regina, kuerinya

SELECT ('2011-11-22T12:00:00'::TIMESTAMP WITHOUT TIME ZONE) 
                               AT TIME ZONE 'America/Vancouver'

memberi saya 2011-11-22 14:00:00-06 hasil dari. Itu tidak ideal , tetapi setidaknya memberikan titik waktu instan (saya pikir). Saya percaya bahwa jika Anda mengambilnya dengan pustaka klien - atau membandingkannya dengan TIMESTAMP WITH TIME ZONE lain - Anda akan mendapatkan hasil yang tepat. Hanya konversi teks yang kemudian menggunakan sistem zona waktu untuk keluaran.

Apakah itu cukup baik untuk Anda? Bisakah Anda mengubah SCHEDULES.time bidang menjadi TIMESTAMP WITHOUT TIME ZONE bidang, atau (pada waktu kueri) menggabungkan waktu dari bidang dengan tanggal untuk membuat stempel waktu tanpa zona waktu?

EDIT:Jika Anda senang dengan "tanggal saat ini" terlihat seperti Anda bisa mengubah kueri Anda menjadi:

SELECT (current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

Tentu saja, sistem saat ini tanggal mungkin tidak sama dengan tanggal saat ini di zona waktu lokal . Saya berpikir ini akan memperbaiki bagian itu...

SELECT ((current_timestamp AT TIME ZONE USERS.tz)::DATE + schedules.time)
       AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

Dengan kata lain:

  • Ambil momen saat ini
  • Menentukan tanggal/waktu lokal di zona waktu pengguna
  • Catat tanggalnya
  • Tambahkan waktu jadwal ke tanggal tersebut untuk mendapatkan TIMESTAMP WITHOUT TIME ZONE
  • Gunakan AT TIME ZONE untuk menerapkan zona waktu pada tanggal/waktu lokal tersebut

Saya yakin ada cara yang lebih baik, tapi saya berpikir masuk akal.

Anda harus menyadari bahwa dalam beberapa kasus ini bisa gagal:

  • Apa yang Anda inginkan untuk waktu 01:30 pada hari ketika jam melompat dari 01:00 ke 02:00, jadi 01:30 tidak muncul sama sekali?
  • Apa yang Anda inginkan untuk waktu 01:30 pada hari ketika jam kembali dari 02:00 ke 01:00, jadi 01:30 terjadi dua kali?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa Postgres mengatakan kolom tidak ada?

  2. Bagaimana menghindari banyak sisipan di PostgreSQL

  3. POSTGRES SALIN DARI PROGRAM ke tabel dinamis dengan kolom yang tidak diketahui

  4. cara menghitung saldo di software akuntansi menggunakan fungsi jendela postgres

  5. Bagaimana cara menghitung baris terkait termasuk subkategori?