Di PostgreSQL, Anda dapat menggunakan AT TIME ZONE
klausa untuk mengonversi stempel waktu ke zona waktu lain.
Sintaks
Anda dapat menggunakannya dengan salah satu dari tiga varian berikut:
timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone
Dimana zone
adalah zona waktu yang Anda inginkan untuk dikonversi ke nilai di sebelah kiri.
Untuk memperjelas, satu-satunya perbedaan antara ketiga varian tersebut adalah pada tipe data stempel waktu yang akan dikonversi.
Ketiga tipe data tersebut adalah:
timestamp with time zone
timestamp without time zone
time with time zone
Hasil yang Anda dapatkan akan tergantung pada tipe datanya.
Tabel berikut menguraikan hasil yang dihasilkan setiap varian.
Ekspresi | Jenis Pengembalian | Deskripsi |
---|---|---|
stempel waktu dengan zona waktu PADA ZONA WAKTU | timestamp without time zone | Konversi stempel waktu yang diberikan dengan zona waktu ke zona waktu baru, tanpa penunjukan zona waktu |
stempel waktu tanpa zona waktu PADA ZONA WAKTU | timestamp with time zone | Perlakukan stempel waktu yang diberikan tanpa zona waktu karena terletak di zona waktu yang ditentukan |
waktu dengan zona waktu PADA ZONA WAKTU | time with time zone | Konversi waktu tertentu dengan zona waktu ke zona waktu baru |
Variasi 1
Inilah yang terjadi jika Anda mengonversi timestamp with time zone
nilai.
SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Hasil:
2025-11-20 02:00:00
Ketika stempel waktu asli adalah timestamp with time zone
nilai, itu digeser ke zona waktu yang ditentukan, dan hasilnya dikembalikan tanpa offset zona waktu.
Inilah yang terjadi jika saya mengubah offset zona waktu dari nilai input.
SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Hasil:
2025-11-20 01:00:00
Stempel waktu yang dihasilkan digeser sesuai dengan zona waktu input.
Dan jika Anda menentukan timestamp with time zone
, tetapi stempel waktu asli tidak benar-benar menyertakan zona waktu, maka zona waktu lokal diasumsikan.
SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Hasil:
2025-11-19 16:00:00
Dalam hal ini, stempel waktu yang dihasilkan telah dikembalikan delapan jam. Ini berarti bahwa zona waktu lokal saya delapan jam lebih cepat dari Afrika/Kairo.
Kita dapat melihat offset zona waktu yang digunakan dengan memilih nilai input secara langsung.
SELECT timestamp with time zone '2025-11-20 00:00:00';
Hasil:
2025-11-20 00:00:00+10
Varian 2
Inilah yang terjadi jika stempel waktu asli menggunakan timestamp without time zone
nilai.
Dengan kata lain, tidak sertakan zona waktu.
SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Hasil:
2025-11-20 08:00:00+10
Jika stempel waktu asli tidak menyertakan zona waktu, hasilnya akan ditampilkan menggunakan TimeZone
saat ini pengaturan dan offset zona waktu ditambahkan.
Ini berlaku setiap kali Anda menentukan timestamp without time zone
, bahkan jika stempel waktu sebenarnya berisi offset zona waktu.
SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';
Hasil:
2025-11-20 08:00:00+10
Ini sudah diduga, karena jika saya memilih timestamp without time zone
nilai, ini yang saya dapatkan:
SELECT timestamp without time zone '2025-11-20 00:00:00+12';
Hasil:
2025-11-20 00:00:00
Varian 3
Inilah yang terjadi ketika stempel waktu asli menggunakan time with time zone
nilai.
SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Hasil:
02:00:00+02
Ini mengubah time with time zone
nilai ke zona waktu baru, dan menambahkan offset zona waktu ke hasilnya.
Inilah yang terjadi jika saya mengubah offset zona waktu dari nilai input.
SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Hasil:
01:00:00+02
Stempel waktu yang dihasilkan digeser sesuai dengan zona waktu input.
Dan jika Anda menentukan time with time zone
, tetapi stempel waktu asli sebenarnya tidak menyertakan zona waktu, zona waktu lokal diasumsikan.
SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Hasil:
16:00:00+02
Dalam hal ini, stempel waktu yang dihasilkan telah dikembalikan delapan jam (karena zona waktu lokal saya delapan jam lebih cepat dari Afrika/Kairo).
Kita dapat melihat offset zona waktu yang digunakan dengan memilih nilai input secara langsung.
SELECT time with time zone '00:00:00';
Hasil:
00:00:00+10
Waktu Tanpa Zona Waktu
Meskipun dokumentasi Postgres tidak menyertakan time without time zone
varian, ini contohnya.
SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Hasil:
16:00:00+02
Jadi dalam contoh ini zona waktu lokal diasumsikan untuk zona waktu yang akan dikonversi.