sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta reda på antalet månader mellan 2 datum

Uttrycket

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

ger 30 days . Vi förväntar oss 1 month eftersom båda värdena pekar på de sista dagarna i månaden. Om vi ​​lägger till 1 dag till värdena får vi första dagarna i nästa månad och

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

ger oss 1 månad som förväntat. Så låt oss kontrollera om vi har två sista dagar i månaden och i det här fallet returålder för de kommande dagarna. I andra fall kommer vi att returnera åldersintervall för ursprungliga värden:

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

Några exempel:

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. Ändra lösenordet på SA-inloggningen i SQL Server (T-SQL-exempel)

  2. MySQL - Mac - Fel 2002 - Kan inte ansluta till lokal... via socket

  3. Verktyg för att skriva tabelldata

  4. Tillåt endast postgres användarlistroller