一个产生时间序列的sql

生成两个时间段内所有相隔月数的列表,这个里面最需要考虑的就是开始时间和结束时间的边界问题.


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

Technorati :

Relative Posts

Tags: ,

Leave a Reply