select date '2016-06-29' + rownum - 1 ddate,
       trunc(trunc(date'2016-06-29' + rownum - 1),'mm') monstart,
       trunc(last_day(date'2016-06-29' + rownum - 1)) monend
  from dual
connect by rownum < date '2030-12-31' - date '2016-06-29' + 1;

解决方案 »

  1.   


    create table test(ddate date, monstart date, monend date);insert into test(ddate, monstart, monend)
    select date '2016-06-29' + rownum - 1 ddate,
           trunc(trunc(date'2016-06-29' + rownum - 1),'mm') monstart,
           trunc(last_day(date'2016-06-29' + rownum - 1)) monend
      from dual
    connect by rownum < date '2030-12-31' - date '2016-06-29' + 1;
      

  2.   

    也可以换成level的形式。
    create table test(dtime date, dt_start date, dt_end date);
     
    insert into test(dtime, dt_start, dt_end)
    with tmp as
    (select to_date('2016-06-29','yyyy-mm-dd') dtime from dual)
    select dtime + level - 1 dtime,
           trunc(trunc(dtime)+ level - 1,'mm') dt_start, 
       trunc(last_day(dtime+ level - 1)) dt_end, 
      from tmp
    connect by level <= date '2030-12-31' - dtime + 1;