sql >> データベース >  >> RDS >> PostgreSQL

2つの日付の間の月数を調べる

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

    30 daysを与える 。 1 monthを予定しています 両方の値が月末を指しているためです。値に1日を追加すると、翌月の最初の日が取得され、

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

    期待通り1ヶ月です。それでは、月の最後の2日があるかどうかを確認し、この場合は次の日の年齢間隔を返します。それ以外の場合は、元の値の年齢間隔を返します:

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

    いくつかの例:

    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. 特定の範囲の動的最小値(mysql)

    2. スタンバイDBを再構築する

    3. 過去10日間の行を取得する

    4. 時刻を抽出するためのより良い方法はありますか?