Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

oracle sql में व्यावसायिक दिन जोड़ना

आप इसे आजमा सकते हैं:

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

connect by dual . का उपयोग करके खंड।

पी.एस. सार्वजनिक छुट्टियों के मामले को नजरअंदाज कर दिया, जो एक संस्कृति से दूसरी संस्कृति में भिन्न होता है, यह सवाल केवल सप्ताहांत से संबंधित होने पर निर्भर करता है।

Rextester डेमो

संपादित करें: मान लें कि आपके पास '2018-09-25' और '2018-09-26' (दिनों के इस सेट में) को राष्ट्रीय अवकाश हैं, तो निम्नलिखित पर विचार करें:

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

जो इस मामले में अगले एक दिन पुनरावृति करता है, जब तक कि यह अवकाश सप्ताहांत के साथ मेल नहीं खाता।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-29283 कैसे हल करें:अमान्य फ़ाइल ऑपरेशन

  2. Oracle SQL डेवलपर का उपयोग करके टेक्स्ट फ़ाइल में CLOB निर्यात करना

  3. मैं किसी दिए गए समय के बाद Oracle में तालिकाओं को स्वचालित रूप से कैसे अनलॉक कर सकता हूं?

  4. स्प्रिंग डेटा रिपॉजिटरी में Oracle मटेरियलाइज्ड व्यू को रिफ्रेश करें

  5. Oracle SQL डेवलपर में एक नया डेटाबेस और नया कनेक्शन बनाना