设为首页 收藏本站
查看: 906|回复: 0

[经验分享] oracle相关日期处理函数

[复制链接]

尚未签到

发表于 2016-7-17 10:02:54 | 显示全部楼层 |阅读模式
  今天写了一个关于比较麻烦的日期判断的函数,先贴上放这里存着,主要是根据日期判断领料是否超支的
  相关需求
一.领料金额标准是从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;
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245205-1-1.html 上篇帖子: oracle学习笔记(1) 下篇帖子: Oracle 分页查询实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表