生成两个时间段内所有相隔月数的列表,这个里面最需要考虑的就是开始时间和结束时间的边界问题.
select to_char(add_months(c.a, rownum - 1), 'YYYYMM')
from (select (case
when last_day(to_date('&starttime', 'YYYY-MM-DD')) -
to_date('&starttime', 'YYYY-MM-DD') = 0 then
add_months(trunc(to_date('&starttime', 'YYYY-MM-DD'), 'MM'),
1)
else
trunc(to_date('&starttime', 'YYYY-MM-DD'), 'MM')
end) a
from dual) c,
(select (case
when to_date('&endtime', 'YYYY-MM-DD') -
trunc(to_date('&endtime', 'YYYY-MM-DD'), 'MM') > 0 then
trunc(to_date('&endtime', 'YYYY-MM-DD'), 'MM')
else
add_months(trunc(to_date('&endtime', 'YYYY-MM-DD'), 'MM'),
-1)
end) a
from dual) d
connect by level <= months_between(d.a, c.a) + 1
--2011年1月17日改进
生成的时间列表如下:
1 200501 2 200502 3 200503 4 200504 5 200505 6 200506 7 200507 8 200508 9 200509 10 200510 11 200511 12 200512 13 200601 14 200602 15 200603 16 200604 17 200605 18 200606 19 200607 20 200608 21 200609 22 200610 23 200611 24 200612 25 200701