फरवरी एक महीना नहीं है, यह एक साल में एक महीने का सामान्य नाम है। उचित अर्थ में एक "माह" फरवरी 2016, या फरवरी 2017 आदि है। आपके वांछित आउटपुट के आधार पर, मुझे लगता है कि आपका मतलब फरवरी 2016 है।
समस्या मामूली है। हालाँकि आप महीने को परिभाषित करते हैं, आप महीने के पहले और आखिरी दिन की पहचान कर सकते हैं। उदाहरण के लिए, यदि आप महीने को छह-वर्ण वाली स्ट्रिंग के रूप में इनपुट करते हैं:input = '201602'
, तो आप कुछ इस तरह का उपयोग कर सकते हैं
to_date(input, 'yyyymm') as month_start,
last_day(to_date(input, 'yyyymm')) as month_end
और फिर इस तरह दिनों की संख्या की गणना करें:
तैयारी (एसक्यूएल प्लस में):
SQL> variable input varchar2(30)
SQL> exec :input := '201602';
PL/SQL procedure successfully completed.
SQL> alter session set nls_date_format = 'dd/mm/yyyy';
क्वेरी :
with
test_dates ( datefrom, dateto ) as (
select to_date('28/1/2016', 'dd/mm/yyyy'), to_date('15/2/2016', 'dd/mm/yyyy') from dual union all
select to_date('10/2/2016', 'dd/mm/yyyy'), to_date('3/3/2016' , 'dd/mm/yyyy') from dual union all
select to_date('5/2/2016' , 'dd/mm/yyyy'), to_date('16/2/2016', 'dd/mm/yyyy') from dual union all
select to_date('20/1/2016', 'dd/mm/yyyy'), to_date('10/3/2016', 'dd/mm/yyyy') from dual
)
-- end of test data; solution (SQL query) begins below this line
select t.datefrom, t.dateto, to_char(to_date(:input, 'yyyymm'), 'MON yyyy') as month,
case when t.datefrom > m.month_end or t.dateto < m.month_start then 0
else least(t.dateto, m.month_end) - greatest(t.datefrom, m.month_start) + 1
end as number_of_days
from test_dates t cross join
( select to_date(:input, 'yyyymm') as month_start,
last_day(to_date(:input, 'yyyymm')) as month_end
from dual) m
;
आउटपुट :(नोट:आपके "वांछित आउटपुट" में नंबर गलत हैं)
DATEFROM DATETO MONTH NUMBER_OF_DAYS
---------- ---------- -------- --------------
28/01/2016 15/02/2016 FEB 2016 15
10/02/2016 03/03/2016 FEB 2016 20
05/02/2016 16/02/2016 FEB 2016 12
20/01/2016 10/03/2016 FEB 2016 29
4 rows selected.