Oracle
 sql >> Baza danych >  >> RDS >> Oracle

dodawanie dni roboczych w Oracle sql

Możesz spróbować tego :

select max(date_field_two) as date_field_two
  from
 (
 select date'2018-08-30'+  
    cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH') 
                                              in ('6','7') then 
            0
          else
            level
          end as int) as date_field_two, 
 sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')  
                                               in ('6','7') then 
            0
          else
            1
          end as int)) over (order by level) as next_day
      from dual
    connect by level <= 20*1.5 
-- 20 is the day to be added, every time 5(#of business days)*1.5 > 7(#of week days)
-- 7=5+2<5+(5/2)=5*(1+1/2)=5*1.5 [where 1.5 is just a coefficient might be replaced a greater one like 2]
-- so 4*5*1.5=20*1.5 > 4*7 
  )    
 where next_day = 20;

 DATE_FIELD_TWO
-----------------
   27.09.2018

za pomocą connect by dual klauzula.

PS Zignorowano sprawę świąt państwowych, które różnią się w zależności od kultury, w zależności od tego, czy pytanie dotyczy tylko weekendów.

Prezentacja Rextestera

Edytuj: Załóżmy, że masz święta państwowe w dniach „2018-09-25” i „2018-09-26” (w tym zestawie dni), a następnie rozważ następujące kwestie:

select max(date_field_two) as date_field_two
  from
 (
 select date'2018-08-30'+  
        (case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH') 
                                              in ('6','7') then 
               0
              when date'2018-08-30'+level in (date'2018-09-25',date'2018-09-26') then
               0
              else
               level
              end) as date_field_two, 
 sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')  
                                               in ('6','7') then 
                0
               when date'2018-08-30'+level in (date'2018-09-25',date'2018-09-26') then
                0 
               else
                1
               end as int)) over (order by level) as next_day
      from dual
    connect by level <= 20*2 
  )    
 where next_day = 20;

 DATE_FIELD_TWO
-----------------
   01.10.2018

który powtarza się jeden dzień później, jak w tym przypadku, chyba że to święto zbiega się z weekendem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizacja kolumny na podstawie poprzedniego rekordu

  2. Lepszy sposób na ustrukturyzowanie instrukcji PL/SQL IF THEN?

  3. Czy w Oracle można wstawić kolumnę do tabeli?

  4. ResultSet.getTimestamp(data) vs ResultSet.getTimestamp(data, Calendar.getInstance(tz))

  5. Replikacja Oracle 11g — korzystanie z odświeżania przy zatwierdzeniu ze zdalną bazą danych (łącza do bazy danych)