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

Cara Menemukan Interval Antara Dua Tanggal di PostgreSQL

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan kesalahan saat memetakan kolom PostgreSQL LTREE di hibernate

  2. Indeks GIN pada kolom smallint[] tidak digunakan atau operator kesalahan tidak unik

  3. Apa urutan default dari daftar yang dikembalikan dari panggilan filter Django?

  4. Satu Sistem Keamanan untuk Aplikasi, Penyatuan Koneksi, dan PostgreSQL - Kasus untuk LDAP

  5. Cara Menggabungkan String di PostgreSQL