oracle相关日期处理函数

今天写了一个关于比较麻烦的日期判断的函数,先贴上放这里存着,主要是根据日期判断领料是否超支的

相关需求
一.领料金额标准是从6.26-7.25.(7月)  7.26-8.25算为8月.除12,1月.12月为11.26-12.31.
1月为1.1-1.25。
二.7月份填的金额标准只对6.26-7.25.(7月)当月有用,到26日了,金额标准控制自动取消.
只有填了8月的金额标准,才对8月有控制,以此类推.

 

-判断领料是否超支
Function f_if_llcz(p_rq varchar2, p_bmmc varchar2, p_xmbm varchar2) return number
is
	v_rq date;
    v_begin date;--统计开始时间
  v_end date;      --统计结束时间
  v_rqts Number; --  当前日期天数
  v_month Number;--    当前月份
  v_year Number;--     当前年
	v_bzje WZ_LLJE.BZJE%type;
	v_sjje WZ_LLJE.SJJE%type;
	v_cnt number;
	v_flag number;
begin
--	v_rq := trunc(to_date(p_rq, 'yyyy-mm-dd'), 'mm');
  
  --处理传进来的日期
   v_rqts := to_number(substr(p_rq,instr(p_rq,'-',-1)+1)) ; 
  v_month := to_number(substr(p_rq,instr(p_rq,'-',1)+1,2)) ;
  v_year := to_number(substr(p_rq,1,4));
  
    If 1<v_month  and v_month< 12  then
       if v_rqts<=25 then --如果日期小于25日 统计区间就是上个月25日到当天
          v_begin := to_date(to_char(v_year)||'-'||to_char(v_month-1)||'-'||'26','yyyy-mm-dd'); 
            v_end :=to_date(p_rq,'yyyy-mm-dd');
           v_rq:=to_date(to_char(v_year)||'-'||to_char(v_month),'yyyy-mm'); 
          end if;
          if v_rqts>26 then --如果日期大于25日 统计区间就是从当月26日到当天
          v_begin := to_date(to_char(v_year)||'-'||to_char(v_month)||'-'||'26','yyyy-mm-dd'); 
           v_end :=to_date(p_rq,'yyyy-mm-dd');
           v_rq:=to_date(to_char(v_year)||'-'||to_char(v_month+1),'yyyy-mm'); 
          end if;
   --如果是1月份 查询起止时间就是本月1日到当天
  Elsif v_month = 1 then
      v_begin := to_date(to_char(v_year)||'-'||to_char(v_month)||'-'||'1','yyyy-mm-dd');
       v_end :=to_date(p_rq,'yyyy-mm-dd');  
      v_rq:=to_date(to_char(v_year)||'-'||to_char(v_month),'yyyy-mm'); 
      
       --如果是12月份 查询起止时间就是上月26日到当天
  Elsif  v_month = 12 then
       v_begin := to_date(to_char(v_year)||'-'||to_char(v_month-1)||'-'||'26','yyyy-mm-dd');
        v_end :=to_date(p_rq,'yyyy-mm-dd'); 
       v_rq:=to_date(to_char(v_year)||'-'||to_char(v_month),'yyyy-mm'); 
      end if;  
  
	select sum(spje) into v_sjje from wz_lljhxb a, wz_lljhpb b 
	where a.bh = b.bh and sqrq  >=v_begin and  sqrq<=v_end  and b.bmmc = p_bmmc 
	and b.xmbm = p_xmbm and b.bill_state='1'  group by b.bmmc;
	select count(*) into v_cnt from wz_llje 
	where to_date(year || '-' || month, 'yyyy-mm') = v_rq and bmmc = p_bmmc;
	if v_cnt = 0 then --该月没有定标准
		v_sjje := 0; --让实际金额等于零,于是总不会超支
	else
		select bzje into v_bzje from wz_lljexb 
		where pbbh = to_char(v_rq, 'yyyymm') || p_bmmc and xmbm = p_xmbm;
	end if;

  if(v_bzje is null) then
   v_flag := 0;
   else
      if nvl(v_sjje, 0) > nvl(v_bzje, 0) then --实际金额大于标准金额,v_flag为1
        v_flag := 1;
      else
        v_flag := 0;
      end if;
	end if;
	
	return v_flag;
end;

 

你可能感兴趣的:(oracle,F#)