在线等,如何求两个日期之间有多少个星期天?1. 如果求两个日期之间间隔多少天,可以把这两个日期之间相减,就可以了.2. 如果要求两个日期之间有多少个星期天,怎么搞,目前我采用的方法是:
   把两个日期之间的每一天都拿出来作判断:
     如果这天是星期天就累加  1 , 就像下面的程式, 但是这种做法速度太慢了. 请问各位大哥,有没有更好方法求
两个日期之间有多少个星期天啊?资料库版本为 Oracle 9I    while v_date_s <= v_date_e loop
       select  to_char(v_date_s  , 'D') 
       into v_day 
       from dual  ;
       
       if v_day <> 1 then
         v_total := v_total + 1 ;
       end if;
       v_date_s := v_date_s + 1 ;
       
    end loop ;

解决方案 »

  1.   

    while v_date_s  <= v_date_e loop 
           select  to_char(v_date_s  , 'D')  
           into v_day  
           from dual  ; 
            
           if v_day  = 1 then 
             v_total := v_total + 1 ;
             v_date_s := v_date_s + 7 ; 
           else
              v_date_s := v_date_s + 1 ;
           end if; 
        end loop ; 
      

  2.   

    select 
           /*日期,to_char(日期, 'd') ,to_char(日期,'DAY'),*/sum(decode(to_char(日期, 'd'),1,1,0))
      from (select to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) 日期
              from user_objects
             where rownum < 367
               and to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) <
                   to_date('2009-01-01', 'yyyy-mm-dd'));
    select 
          日期,to_char(日期, 'd') ,to_char(日期,'DAY')
      from (select to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) 日期
              from user_objects
             where rownum < 367
               and to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) <
                   to_date('2009-01-01', 'yyyy-mm-dd')) where to_char(日期, 'd')=1;
      

  3.   

    while v_date_s   <= v_date_e loop  
           select  to_char(v_date_s  , 'D')   
           into v_day   
           from dual  ;  
             
           if v_day  = 1 then  
             exit; 
           else 
              v_date_s := v_date_s + 1 ; 
           end if;  
        end loop ;      v_total :=(v_date_e - v_date_s)/7;
      

  4.   

    select count(1) week
    from (select rownum rn  from all_objects
          where rownum <= to_date('20080427','yyyymmdd') - to_date('20080421','yyyymmdd')+1)
    where to_char(to_date('20080421','yyyymmdd')+rn-1,'D') in ('1');
      

  5.   

    其实有种简单的思路
    比如说是同年
    SELECT TO_CHAR (SYSDATE, 'iw') - TO_CHAR (SYSDATE - 60, 'iw'),
           TO_CHAR (SYSDATE, 'iw'), TO_CHAR (SYSDATE - 60, 'iw')
      FROM DUAL
    我这是统计当前日到60天前有几周(也相当于有几个星期天)
      

  6.   

    如果是不同年SELECT decode (TO_CHAR (SYSDATE + 1200, 'yyyy'),
                   TO_CHAR (SYSDATE, 'yyyy'),
                   TO_CHAR (SYSDATE + 1200, 'iw') - TO_CHAR (SYSDATE, 'iw'),
                     52
                   - TO_CHAR (SYSDATE, 'iw')
                   +   52
                     * (  TO_CHAR (SYSDATE + 1200, 'yyyy')
                        - TO_CHAR (SYSDATE, 'yyyy')
                       )
                   + TO_CHAR (SYSDATE + 1200, 'iw')
                  ) sun_num,
           TO_CHAR (SYSDATE + 1200, 'iw') end_week, TO_CHAR (SYSDATE, 'iw') start_week,
           SYSDATE + 1200 end_day, SYSDATE start_day
      FROM DUAL不过这个算法我没仔细验证过,可能在日期上有点小的偏差,总的思路是可用的,你再验证下具体的值对不对
      

  7.   

    上面的语句,把sysdate+1200换成统计结束日,sysdate换成统计起始日,后面的几个字段不需要,我只是为了验证具体的日期
    SELECT decode (TO_CHAR (统计结束日, 'yyyy'),
                   TO_CHAR (统计起始日, 'yyyy'),
                   TO_CHAR (统计结束日, 'iw') - TO_CHAR (统计起始日, 'iw'),
                     52
                   - TO_CHAR (统计起始日, 'iw')
                   +   52
                     * (  TO_CHAR (统计结束日, 'yyyy')
                        - TO_CHAR (统计起始日, 'yyyy')
                       )
                   + TO_CHAR (统计结束日, 'iw')
                  ) sun_num
      FROM DUAL 
      

  8.   

    上面还有点小错误 ,年份相减应该再减1,否则会多一年的
    SELECT decode (TO_CHAR (统计结束日, 'yyyy'),
                   TO_CHAR (统计起始日, 'yyyy'),
                   TO_CHAR (统计结束日, 'iw') - TO_CHAR (统计起始日, 'iw'),
                     52
                   - TO_CHAR (统计起始日, 'iw')
                   +   52
                     *((  TO_CHAR (统计结束日, 'yyyy')
                        - TO_CHAR (统计起始日, 'yyyy')
                       )-1) 
                   + TO_CHAR (统计结束日, 'iw')
                  ) sun_num
      FROM DUAL 
    思路
    decode 统计结束日的年份
    条件一  如果和超始日同年,则结束日的周-起始日的周
    默认,52-超始日的周+52*(两个日期年份之差-1)+结束日的的周数
      

  9.   

    select count(*) from 
     (select  TO_CHAR(to_date('2008-02-01','yyyy-MM-dd' ) +rownum-1 ,'day') dat
     from user_objects 
     where rownum<=(to_date('2008-03-01','yyyy-MM-dd')-to_date('2008-02-01','yyyy-MM-dd')+1) ) v
     where v.dat = '星期日';
    这个是查'2008-02-01'到'2008-03-01'有几个星期天的,我试过,没问题的
      

  10.   

    其实这是个oracle内部函数的问题,用的就是to_char和to_date这两个函数select  TO_CHAR(to_date('2008-02-01','yyyy-MM-dd' ) +rownum-1 ,'day') dat 
     from user_objects  
     where rownum <=(to_date('2008-03-01','yyyy-MM-dd')-to_date('2008-02-01','yyyy-MM-dd')+1)这个是求出两个日期中间的一段时间,时间格式'day'类型的,也就是星期几,然后再找出是星期天的,就行了.