我想请问一下 我现在需要写一个存储过程 用于判断一个月有几周 例如(201004月就有5周 20100401-20100402   20100405-20100409  20100412-20100416  20100419-20100423 20100426-20100430)
 我现在有表如下:
    create table test(
    Id number not null,  --ID
    weedNo number not null,  --周号(1,2,3)
    beginDay varchar(20) not null,--开始时间
    endDay varchar(20) not null,  --结束时间
   )
  
  我现在需要写一个存储过程 输入一个年份和月份就调用此存储过程 在数据库中添加多条记录
    请教高手 多谢!!

解决方案 »

  1.   

    select 
    trunc(next_day(sysdate,1),'mm') 第一周开始,
    trunc(next_day(sysdate,1),'dd') 第一周结束,
    trunc(next_day(sysdate,1),'dd')+1 第二周开始,
    trunc(next_day(sysdate,1)+7) 第二周结束 
    from dual;
    结果:
    第一周开始 第一周结束 第二周开始 第二周结束
    2010-05-01 2010-05-02 2010-05-03 2010-05-09
      

  2.   

    SQL> select week_of_year + 1 - min(week_of_year) over() week_no_of_month,
      2         first_day_of_week,
      3         last_day_of_week
      4    from (
      5          select min(the_day) first_day_of_week,
      6                 max(the_day) last_day_of_week,
      7                 to_char(the_day, 'IW') week_of_year
      8            from (
      9                  --把一个月的日期都列出来
     10                  select start_date + rownum - 1 the_day
     11                    from (
     12                          select to_date('201004' || '01', 'yyyymmdd') start_date,
     13                                 add_months(to_date('201004' || '01', 'yyyymmdd'), 1) - 1 end_date
     14                            from dual
     15                         )
     16                    connect by (start_date + rownum - 1) <= end_date
     17                  ) t
     18            group by to_char(the_day, 'IW')
     19          )
     20  /
     
    WEEK_NO_OF_MONTH FIRST_DAY_OF_WEEK LAST_DAY_OF_WEEK
    ---------------- ----------------- ----------------
                   1 2010/4/1          2010/4/4
                   2 2010/4/5          2010/4/11
                   3 2010/4/12         2010/4/18
                   4 2010/4/19         2010/4/25
                   5 2010/4/26         2010/4/30
      

  3.   

    判断一个月有几周的函数
    CREATE OR REPLACE FUNCTION weeknumOfMonth(p_month IN VARCHAR2)
    RETURN NUMBER
    AS
    weeknum NUMBER;
    begin
    SELECT count(DISTINCT to_char(to_date(p_month,'yyyymm')+ROWNUM-1,'iw'))
      into weeknum
    FROM dual
    CONNECT BY ROWNUM<=add_months(to_date(p_month,'yyyymm'),1)-to_date(p_month,'yyyymm');
    RETURN weeknum;
    exception
    WHEN others THEN
      RETURN -1;
    END;
      

  4.   

    CREATE OR REPLACE PACKAGE SP_WEEK IS
      -- 功能 : 一个月有几周,开始时间和结束时间
      TYPE CUR IS REF CURSOR;
      PROCEDURE SP_WEEK(P_YEARMONTH   VARCHAR2,
                               C OUT CUR);
    END SP_WEEK;CREATE OR REPLACE PACKAGE BODY SP_WEEK IS
      PROCEDURE SP_WEEK( P_YEARMONTH  VARCHAR2,
                               C OUT CUR) IS
      BEGIN
        IF LENGTH(P_YEARMONTH)=6 THEN
             OPEN C FOR
          SELECT   week_of_year + 1 - min(week_of_year) over() week_no_of_month,
               first_day_of_week,
               last_day_of_week
          from (
                select min(the_day) first_day_of_week,
                       max(the_day) last_day_of_week,
                       to_char(the_day, 'IW') week_of_year
                  from (
                       --把一个月的日期都列出来
                       select start_date + rownum - 1 the_day
                         from (
                               select to_date(P_YEARMONTH   || '01', 'yyyymmdd') start_date,
                                      add_months(to_date(P_YEARMONTH   || '01', 'yyyymmdd'), 1) - 1 end_date
                                 from dual
                             )
                       connect by (start_date + rownum - 1) <= end_date
                     ) t
                group by to_char(the_day, 'IW')
            );
        ELSE
          OPEN C FOR SELECT '年月格式为:201004' ERROR_MES FROM DUAL;
         END IF;
      END;
    END SP_WEEK;