PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak dodać liczbę dni roboczych do podanej daty?

Kluczem jest wygenerowanie serii dni roboczych i ponumerowanie ich za pomocą 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;

Wyniki zapytania testowego wydają się poprawne:

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)

Alternatywnie możesz znaleźć datę w pętli:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odbudować niespójne serwery PostgreSQL?

  2. Ograniczenie zdefiniowane ODROCZONY POCZĄTKOWO NATYCHMIAST jest nadal ODROCZONY?

  3. Kilka obszarów ulepszeń w PostgreSQL 9.4

  4. PostgreSQL:FATAL - Uwierzytelnienie peera nie powiodło się dla użytkownika (PG::ConnectionBad)

  5. Skalowanie połączeń w PostgreSQL przy użyciu puli połączeń