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

Bagaimana Fungsi Timezone() Bekerja di PostgreSQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dalam fungsi pemicu, cara mendapatkan bidang mana yang diperbarui

  2. memulai postgresql dan pgadmin di windows tanpa instalasi

  3. Orbeon Membentuk koneksi Postgres DB

  4. Rel metode yang tidak ditentukan untuk ActiveRecord_Associations_CollectionProxy

  5. Bagaimana CONCAT_WS() Bekerja di PostgreSQL