Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

thêm ngày làm việc trong oracle sql

Bạn có thể thử cách này:

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

bằng cách sử dụng connect by dual mệnh đề.

P.S. Bỏ qua trường hợp dành cho những ngày nghỉ lễ, điều này khác nhau giữa các nền văn hóa, tùy thuộc vào câu hỏi chỉ liên quan đến cuối tuần.

Rextester Demo

Chỉnh sửa: Giả sử bạn có ngày nghỉ lễ quốc gia vào '2018-09-25' và '2018-09-26' (trong nhóm ngày này), sau đó xem xét những điều sau:

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

sẽ lặp lại vào một ngày tiếp theo, như trong trường hợp này, trừ khi ngày lễ này trùng với cuối tuần.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. khối plsql để lấy kết quả truy vấn sql động

  2. ORA-04076:đặc tả MỚI hoặc CŨ không hợp lệ - PL / SQL - Oracle Trigger

  3. Không thể SUM (TO_NUMBER (trường varchar2)):ORA 01722 [ORACLE]

  4. Mặt nạ định dạng ngày Oracle cho múi giờ là gì?

  5. Thay đổi mật khẩu SYS trong RAC