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

特定の日付に営業日数を追加する方法

    重要なのは、一連の営業日を生成し、row_number()で番号を付けることです。 :

    create or replace function add_business_day(from_date date, num_days int)
    returns date
    as $fbd$
        select d
        from (
            select d::date, row_number() over (order by d)
            from generate_series(from_date+ 1, from_date+ num_days* 2+ 5, '1d') d
            where 
                extract('dow' from d) not in (0, 6) 
                and d not in (select pyha from pyha)
            ) s
        where row_number = num_days
    $fbd$ language sql;
    

    テストクエリの結果は正しいようです:

    select days, add_business_day('2018-12-08', days)
    from generate_series(1, 20) days
    
     days | add_business_day 
    ------+------------------
        1 | 2018-12-10
        2 | 2018-12-11
        3 | 2018-12-12
        4 | 2018-12-13
        5 | 2018-12-14
        6 | 2018-12-17
        7 | 2018-12-18
        8 | 2018-12-19
        9 | 2018-12-20
       10 | 2018-12-21
       11 | 2018-12-27
       12 | 2018-12-28
       13 | 2018-12-31
       14 | 2019-01-02
       15 | 2019-01-03
       16 | 2019-01-04
       17 | 2019-01-07
       18 | 2019-01-08
       19 | 2019-01-09
       20 | 2019-01-10
    (20 rows)
    

    または、ループで日付を見つけることもできます:

    create or replace function add_business_day_loop(from_date date, num_days int)
    returns date
    as $fbd$
    begin
        while num_days > 0 loop
            from_date:= from_date+ 1;
            while from_date in (select pyha from pyha) or extract('dow' from from_date) in (0, 6) loop
                from_date:= from_date+ 1;
            end loop;
            num_days:= num_days- 1;
        end loop;
        return from_date;
    end;
    $fbd$ language plpgsql;
    


    1. postgresql:INSERT INTO ...(SELECT * ...)

    2. Oracleで一時表領域を縮小する方法は?

    3. プロアクティブなSQLServerヘルスチェック、パート5:待機統計

    4. MySQLの複数列の外部キー?