Di PostgreSQL, Anda dapat menggunakan timezone()
berfungsi untuk mengonversi stempel waktu ke zona waktu lain.
Sintaks
Sintaksnya seperti ini:
timezone(zone, timestamp)
Dimana zone
adalah zona waktu yang Anda inginkan timestamp
argumen yang akan diubah menjadi.
Hasil yang Anda dapatkan akan bergantung pada apakah nilai stempel waktu asli menyertakan zona waktu atau tidak (dan berapa nilainya).
Contoh 1 -Bila Stempel Waktu Asli TIDAK Menyertakan Zona Waktu
Inilah yang terjadi jika stempel waktu asli menyertakan zona waktu.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Hasil:
2020-10-25 04:00:00
Jika stempel waktu asli menyertakan zona waktu, timezone()
fungsi menggeser nilai stempel waktu asli ke zona waktu yang ditentukan, dan mengembalikan nilai tanpa zona waktu.
Inilah yang terjadi jika saya mengubah zona waktu stempel waktu input.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Hasil:
2020-10-25 03:00:00
Stempel waktu yang dihasilkan digeser sesuai dengan zona waktu input.
Dan jika Anda menentukan timestamp with time zone
, tetapi stempel waktu asli sebenarnya tidak menyertakan zona waktu, lalu nilai stempel waktu asli digeser ke zona waktu lokal.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Hasil:
2020-10-24 18:00:00
Dalam hal ini, stempel waktu yang dihasilkan telah dikembalikan enam jam. Ini berarti bahwa zona waktu lokal saya enam jam lebih cepat dari India/Mauritius.
Kita dapat melihat offset zona waktu yang digunakan dengan memilih nilai input secara langsung.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Hasil:
2020-10-25 00:00:00+10
Contoh 2 – Ketika Stempel Waktu Asli TIDAK Menyertakan Zona Waktu
Inilah yang terjadi jika stempel waktu asli tidak sertakan zona waktu.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Hasil:
2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Hasil:
2020-10-25 06:00:00+10
Ini sudah diduga, karena jika saya memilih timestamp without time zone
nilai, ini yang saya dapatkan:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Hasil:
2020-10-25 00:00:00
Contoh 3 – stempel waktu lokal
Mari gunakan localtimestamp
berfungsi untuk menjalankan perbandingan antara stempel waktu saat ini di zona waktu saya sendiri, dan stempel waktu yang dihasilkan setelah menggunakan timezone()
berfungsi untuk mengubahnya menjadi zona waktu yang berbeda.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Hasil:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
localtimestamp
fungsi mengembalikan stempel waktu tipe data, yang datang dengan implisit "tanpa zona waktu". Dengan kata lain, stempel waktu dan stempel waktu tanpa zona waktu adalah hal yang sama.
Seperti yang ditunjukkan sebelumnya, ketika tidak ada zona waktu yang ditentukan dalam stempel waktu asli, TimeZone
saat ini pengaturan digunakan dan ditambahkan ke hasil. Dan itulah yang kami dapatkan saat menggunakan localtimestamp
.
Omong-omong, dalam contoh ini saya menggunakan \x
untuk menampilkan hasilnya menggunakan tampilan yang diperluas/output vertikal, agar lebih mudah dibaca.
Contoh 4 – stempel waktu_saat ini
Sekarang mari kita gunakan current_timestamp
fungsi alih-alih localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Hasil (menggunakan keluaran vertikal):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Kali ini offset zona waktu telah ditambahkan ke stempel waktu asli, dan timezone()
hasil tidak lagi menyertakannya.
Kami mendapatkan hasil ini karena current_timestamp
fungsi mengembalikan stempel waktu dengan zona waktu tipe data.
Contoh 5 – Menggunakan Nilai waktu
timezone()
fungsi juga bekerja dengan time
nilai (time with time zone
dan time without time zone
).
Namun, saat menggunakannya pada time with time zone
nilai, offset zona waktu ditambahkan ke hasil.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Hasil (menggunakan keluaran vertikal):
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
Dan untuk kelengkapan, berikut adalah nilai yang sama menggunakan time without time zone
tipe data.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Hasil (menggunakan keluaran vertikal):
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Periksa Zona Waktu Lokal
Jika Anda ingin memeriksa zona waktu lokal Anda sendiri, jalankan SHOW TIMEZONE
.
Inilah yang saya dapatkan saat menjalankan perintah itu.
SHOW TIMEZONE;
Hasil:
Australia/Brisbane
Periksa Offset Zona Waktu
Berbekal pengetahuan di atas, saya sekarang dapat memeriksa dua offset zona waktu dengan menanyakan pg_timezone_names
lihat.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Hasil (menggunakan keluaran vertikal):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Lihat Mengembalikan Daftar Zona Waktu yang Didukung oleh PostgreSQL untuk opsi dan contoh selengkapnya untuk mengembalikan zona waktu di Postgres.