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

Bagaimana AT TIME ZONE Bekerja di PostgreSQL

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 zone 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 zone 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 zone 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.


  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 saya menanyakan semua baris dalam radius 5 mil dari koordinat saya?

  2. Mengurangi parameter postgresql.conf, sekaligus

  3. Bagaimana cara saya mendapatkan dukungan LISTEN/NOTIFY asynchronous/even-driven di Java menggunakan database Postgres?

  4. hilangkan nilai array duplikat di postgres

  5. Di Rails, Tidak dapat membuat database untuk {adapter=>postgresql,