Masalah:
Anda ingin menemukan perbedaan antara dua nilai tanggal/waktu dalam database PostgreSQL.
Contoh:
Basis data kami memiliki tabel bernama employment
dengan data pada kolom id
, first_name
, last_name
, start_date
, dan end_date
:
id | nama_depan | nama_belakang | tanggal_mulai | tanggal_akhir |
---|---|---|---|---|
1 | Barbara | Wilson | 01-02-2010 | 30-10-2018 |
2 | Robert | Anderson | 2001-04-17 | 2011-12-20 |
3 | Steven | Nelson | 01-06-2005 | 23-09-2019 |
Untuk setiap karyawan, mari kita lihat nama depan dan belakang mereka serta perbedaan antara tanggal mulai dan tanggal berakhir pekerjaan mereka. Kami ingin melihat interval dalam tahun, bulan, dan hari.
Solusi 1:
Kami akan menggunakan AGE()
fungsi. Inilah kueri yang akan Anda tulis:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Berikut hasil querynya:
nama_depan | nama_belakang | employment_interval |
---|---|---|
Barbara | Wilson | 8 tahun 8 bulan 29 hari |
Robert | Anderson | 10 tahun 8 bulan 3 hari |
Steven | Nelson | 14 tahun 3 bulan 22 hari |
Diskusi:
Gunakan AGE()
Post PostgreSQL berfungsi untuk mengambil interval antara dua cap waktu atau tanggal. Fungsi ini membutuhkan dua argumen:yang pertama adalah tanggal akhir dan yang kedua adalah tanggal mulai. Dalam contoh kami, kami menggunakan kolom end_date
(yaitu ketika karyawan berhenti melakukan pekerjaan itu) dan kolom start_date
(ketika karyawan memulai pekerjaan itu).
Perbedaan antara tanggal ditampilkan sebagai interval dalam tahun, bulan, hari, jam, dll. Kueri untuk Steven Nelson mengembalikan masa kerja sebagai interval '14 years 3 months 22 days
'; inilah perbedaan antara 01-06-2005, saat ia memulai pekerjaan ini, dan 23-09-2019, saat ia menghentikannya.
AGE()
function juga dapat menampilkan perbedaan antara stempel waktu/tanggal saat ini dan argumen pertama. Dalam hal ini, fungsi hanya memiliki satu argumen:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
Kueri di atas menampilkan interval antara stempel waktu saat ini (untuk teks ini, '26-09-2019') dan tanggal akhir setiap karyawan (kolom end_date
).
nama_depan | nama_belakang | employment_interval |
---|---|---|
Barbara | Wilson | 10 bulan 27 hari |
Robert | Anderson | 7 tahun 9 bulan 6 hari |
Steven | Nelson | 3 hari |
Tiga hari telah berlalu antara hari terakhir pekerjaan Steven dan stempel waktu saat ini (pada saat penulisan, yaitu 26-09-2019).
Solusi 2:
Anda juga dapat menggunakan operator minus ( ‘-’ ) sebagai ganti AGE()
untuk mengurangi dua tanggal.
Inilah kueri yang akan Anda tulis:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
Dalam hasil ini, Anda hanya akan melihat perbedaan dalam hari (bukan tahun, bulan, dan hari):
nama_depan | nama_belakang | employment_interval |
---|---|---|
Barbara | Wilson | 3193 |
Robert | Anderson | 3899 |
Steven | Nelson | 5227 |