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?