sql >> Database >  >> RDS >> PostgreSQL

Ontdek het aantal maanden tussen 2 datums

De uitdrukking

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

geeft 30 days . We verwachten 1 month aangezien beide waarden verwijzen naar de laatste dagen van de maand. Als we 1 dag bij de waarden optellen, krijgen we de eerste dagen van de volgende maand en

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

geeft ons 1 maand zoals verwacht. Dus laten we eens kijken of we twee laatste dagen van de maand hebben en in dit geval het leeftijdsinterval van de volgende dagen. In andere gevallen zullen we het leeftijdsinterval van de oorspronkelijke waarden retourneren:

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 $$;

Enkele voorbeelden:

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. Hoe gebruik je een Oracle Ref Cursor van C# ODP.NET als een ReturnValue-parameter, zonder een opgeslagen functie of procedure te gebruiken?

  2. Geldt de limiet voor het maximale aantal SQL-jointabellen voor de hele query of worden subquery's afzonderlijk geteld?

  3. SQL-query met gemiddelde en groeperen op

  4. Hoe PostgreSQL in een Docker-container te controleren:deel één