sql >> Databáze >  >> RDS >> Oracle

přidání pracovních dnů v Oracle SQL

Můžete zkusit toto:

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

pomocí connect by dual klauzule.

P.S. Ignorován případ státních svátků, které se v jednotlivých kulturách liší v závislosti na tom, zda se otázka týká pouze víkendů.

Ukázka Rextester

Upravit: Předpokládejme, že máte státní svátky „2018-09-25“ a „2018-09-26“ (v této sadě dní), pak zvažte následující:

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

který se opakuje jeden den následující, jako v tomto případě, pokud se tento svátek nekryje s víkendem.



  1. Jaký je váš názor na používání textových identifikátorů ve sloupcích tabulky při přístupu k databázi s ohledem na normalizaci a škálovatelnost?

  2. Jaké konkrétní výjimky představují selhání serializace, když Django používá serializovatelnou úroveň izolace transakcí s postgresql?

  3. Pomalý běh dotazu Postgres

  4. Co je rychlejší COALESCE NEBO ISNULL?