--说明:以周日作为每周的开始
declare 
  v_StartDate date;
  v_EndDate date;
  v_TmpDate date;
  v_year int;
  v_weeks int;
  
begin
  --计算第一周的周末
  v_StartDate :=to_date('2006-01-01','yyyy-mm-dd'); 
  select trunc(v_StartDate,'D') into v_TmpDate from dual;
  
  v_EndDate :=v_TmpDate +6; 
  v_weeks :=1; 
  loop    
    insert into tb_det_week
      (statis_year, start_date, end_date, statis_week)
    values
      ('2006', v_startdate, v_enddate, v_weeks);
      
    if v_EndDate > to_date('2006-12-31','yyyy-mm-dd')  then
      exit;
    end if;
    v_weeks :=v_weeks + 1;
    v_StartDate := v_EndDate + 1;
    v_EndDate := v_EndDate + 7;
  end loop;
  commit;
end;

解决方案 »

  1.   

    simpleOra()你好,不过还有一个问题没有考虑到那就是如果12月份最后一周没有六天该怎么处理.
      

  2.   


    declare 
      v_StartDate date;
      v_EndDate date;
      v_TmpDate date;
      v_year int;
      v_weeks int;
      
    begin
      execute immediate 'truncate table tb_det_week';
      --计算第一周的周末
      v_StartDate :=to_date('2006-01-01','yyyy-mm-dd'); 
      select trunc(v_StartDate,'D') into v_TmpDate from dual;
      
      v_EndDate :=v_TmpDate +6; 
      v_weeks :=1; 
      loop    
        insert into tb_det_week
          (statis_year, start_date, end_date, statis_week)
        values
          ('2006', v_startdate, v_enddate, v_weeks);
        if v_weeks = 52 then
          dbms_output.put_line('v_tempdate' || to_char(v_tmpdate,'yyyy-mm-dd'));
        end if;      
        if v_tmpDate > to_date('2006-12-31','yyyy-mm-dd')  then
          exit;
        end if;
        v_weeks :=v_weeks + 1;
        v_StartDate := v_EndDate + 1;
        v_tmpDate := v_EndDate + 7;
        if v_tmpDate <= to_date('2006-12-31','yyyy-mm-dd') then
          v_endDate :=v_tmpDate;      
        else
          v_endDate := to_date('2006-12-31','yyyy-mm-dd');
        end if;
        
        if v_weeks = 53 then
          dbms_output.put_line('v_enddate' || to_char(v_endDate,'yyyy-mm-dd'));
        end if;   
      end loop;
      commit;
    end;