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

Cari tahu jumlah bulan antara 2 tanggal

Ekspresi

age('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp) 

memberikan 30 days . Kami mengharapkan 1 month karena kedua nilai menunjuk ke hari-hari terakhir dalam sebulan. Jika kita menambahkan 1 hari ke nilai, kita akan mendapatkan hari pertama bulan depan dan

age('2012-12-01 00:00:00'::timestamp, '2012-11-01 00:00:00'::timestamp)

akan memberi kita 1 bulan seperti yang diharapkan. Jadi mari kita periksa apakah kita memiliki dua hari terakhir dalam sebulan dan dalam hal ini mengembalikan interval usia hari-hari berikutnya. Dalam kasus lain, kami akan mengembalikan interval usia dari nilai asli:

create or replace function age_m (t1 timestamp, t2 timestamp)
returns interval language plpgsql immutable
as $$
declare
    _t1 timestamp = t1+ interval '1 day';
    _t2 timestamp = t2+ interval '1 day';
begin
    if extract(day from _t1) = 1 and extract(day from _t2) = 1 then
        return age(_t1, _t2);
    else
        return age(t1, t2);
    end if;
end $$;

Beberapa contoh:

with my_table(date1, date2) as (
values
    ('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2012-12-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2013-01-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2013-02-28 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)
)

select *, age(date1, date2), age_m(date1, date2)
from my_table

        date1        |        date2        |      age       | age_m  
---------------------+---------------------+----------------+--------
 2012-11-30 00:00:00 | 2012-10-31 00:00:00 | 30 days        | 1 mon
 2012-12-31 00:00:00 | 2012-10-31 00:00:00 | 2 mons         | 2 mons
 2013-01-31 00:00:00 | 2012-10-31 00:00:00 | 3 mons         | 3 mons
 2013-02-28 00:00:00 | 2012-10-31 00:00:00 | 3 mons 28 days | 4 mons
(4 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penerapan dan Penskalaan PostgreSQL v13 dengan ClusterControl 1.8.2

  2. Menambahkan Postgresql ke aplikasi Heroku saya - masalah dengan kueri mogok sintaksis?

  3. PostgreSQL:Menggunakan pernyataan AND di LEFT JOIN tidak berfungsi seperti yang diharapkan

  4. Hitung rata-rata dari kolom JSON

  5. Nilai referensi kolom serial di kolom lain selama INSERT yang sama