Tháng Hai không phải là một tháng, nó là tên chung của một tháng trong năm. "Tháng" theo đúng nghĩa là tháng 2 năm 2016 hoặc tháng 2 năm 2017, v.v. Dựa trên kết quả mong muốn của bạn, tôi cho rằng ý bạn là tháng 2 năm 2016.
Vấn đề là tầm thường. Tuy nhiên bạn xác định tháng, bạn có thể xác định ngày đầu tiên và ngày cuối cùng của tháng. Ví dụ:nếu bạn nhập tháng dưới dạng chuỗi sáu ký tự:input = '201602'
, sau đó bạn có thể sử dụng một cái gì đó như
to_date(input, 'yyyymm') as month_start,
last_day(to_date(input, 'yyyymm')) as month_end
và sau đó tính toán số ngày như sau:
Chuẩn bị (trong SQLPlus):
SQL> variable input varchar2(30)
SQL> exec :input := '201602';
PL/SQL procedure successfully completed.
SQL> alter session set nls_date_format = 'dd/mm/yyyy';
Truy vấn :
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
;
Đầu ra :(Lưu ý:các số trong "đầu ra mong muốn" của bạn không chính xác)
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.