PS,1880后程序员

看不完的牙,写不完的程序,跑不完的步。
随笔 - 97, 文章 - 34, 评论 - 10, 引用 - 0
数据加载中……

Oracle计算指定日期到月末的双休日的天数

业务逻辑:
count=0;
计算得到指定日期的下一个周日my_nextsunday
计算得到月末my_lastdate
IF 下一个周日<=月末 THEN
  周数=(月末-下一个周日的天数)/7
  余数=(月末-下一个周日的天数)%7
  IF 余数!=0 THEN count=1;
  count+=周数*2
  IF DAYOFWEEK(指定日期)=1 THEN count+=2;
  ELSE count+=1;
ELSE
  计算 DAYOFWEEK(指定日期)-> DWS
  计算 DAYOFWEEK(月末)-> DWE
  IF DWS<=DME THEN --没有跨周
    IF DWS=1 THEN count+=1;
    IF DWE=7 THEN count+=1;
  ELSE count=2;
END IF;

CREATE OR REPLACE FUNCTION WEEKENDDAY( IN_APP_DATE IN DATE)
RETURN integer IS
    my_lastdate DATE;
    my_nextsunday DATE;
    my_weeks integer;
    my_n_diff integer;
    my_remain integer;
    my_dws integer;
    my_dwe integer;
    out_count integer :=0;
BEGIN
   my_lastdate:=LAST_DAY(IN_APP_DATE);
   select NEXT_DAY(IN_APP_DATE,1) INTO my_nextsunday from dual;
   my_n_diff:=TRUNC( (  my_lastdate - my_nextsunday ), 0 )+1;
   if(my_nextsunday<=my_lastdate) THEN
     my_weeks:=FLOOR(my_n_diff/7);
     my_remain:=mod(my_n_diff,7);
     if my_remain>0 THEN 
       out_count:=1; 
     END IF;    
     out_count:=out_count+my_weeks*2;
     IF to_number(to_char(IN_APP_DATE,'D'))=1 THEN 
       out_count:=out_count+2;
     ELSE 
       out_count:=out_count+1;
     END IF;   
   ELSE
     my_dws:=to_number(to_char(IN_APP_DATE,'D'));
     my_dwe:=to_number(to_char(my_lastdate,'D'));
     IF my_dws<=my_dwe THEN
       IF my_dws=1 THEN 
         out_count:=out_count+1;
       END IF;    
       IF my_dwe=7 THEN 
         out_count:=out_count+1;
       END IF;    
     ELSE
       out_count:=2;
     END IF;  
   end if;
   return out_count;
END WEEKENDDAY;

posted on 2013-08-28 23:15 amenglai 阅读(280) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: