工作中遇到了使用财务年和财务月的问题,现在这个问题应该很普遍了,但是我是新接触的,所以写起来比较难。
公司使用Oracle数据库存储业务数据,以前没有接触过,现在写一下笔记,以便学习和翻阅。
对于这个问题,使用的函数需要自己定义,首先要知道oracle自定义函数的用法。有关自定义函数,网上教程很多,下面见到介绍一下。
语法格式如下:
create or replace function function_name ( argu1 [mode1] datatype1, argu2 [mode2] datatype2, ........ ) return datatype is begin --你的功能代码 end;
函数设计完成后,运行代码,生成函数。因为是oracle编写,所以使用PL/SQL Developer 运行。生成方式应该都知道。需要注意的是,需要将函数写在你要使用该函数的数据库中。如下图中,Functions,如果函数没有问题就会显示为绿色,如果函数中有错误,就会在左上角有一个×,你就需要对函数进行修改。右键->编辑。
函数完成后就可以直接调用该函数,调用过程中需要注意参数类型,以及返回值类型。以上是自定义函数,下面写一下函数实现。
财务月实现1:
1 create or replace function stat_date(d in date, n in number) return date is 2 begin 3 if n=1 then --自然月 4 return d; 5 else if extract(day from d) > n then --与设置的日期进行判断 6 return add_months(d, 1); --返回当前月或下一个月 7 else 8 return d; 9 end if; 10 end if; 11 end;
需要注意到参数类型,这次设计中使用的是 date类型和number类型,可以根据自己需要进行调整。
首先判断是否是自然月,如果是,则直接返回当前日期,如果不是,进行下一步判断。业务日期在设置的日起之后,则返回下个月,否则返回当前月。
PS:如果不先进行判断,那么当是自然月的时候就可能会出错。设置开始日期是1号,那所有的业务日期都会返回下个月,而不是当前月。
财务月实现2:这一种方法相对麻烦,传递的参数都是varchar2类型数据,返回值也是varchar2类型。需要截取字符串,进行判断,要求对字符串有一定了解。
1 create or replace function fun 2 ( 3 day_id varchar2, --日期参数 4 todaydate varchar2 --业务日期 5 ) 6 RETURN varchar2 7 IS 8 9 nowday varchar2(10); 10 d varchar2(10); 11 d2 varchar2(10); 12 BEGIN 13 SELECT (substr(todaydate,9,2)) into nowday from dual; --获取天并赋值 14 select (substr(todaydate,0,7)) into d from dual; --获取年和月 15 select to_char(add_months(to_date(todaydate,'yyyy- mm-dd'),1),'yyyy-mm') into d2 from dual; --月加1 16 if day_id='01' --判断自然月 17 then 18 return d; 19 else if nowday>=day_id --判断财务月应该返回的值 20 then 21 return d2; 22 else 23 return d; 24 end if; 25 end if; 26 end;
方法一返回的是完整的date类型,方法二返回的是年和月,不包含日在内,大家根据需要自己判定。
财务月实现,还有其他方法,这里只介绍这两种。
财务年的实现:
1 create or replace function stat_year( 2 dat in date, --业务日期 3 moth in number, --开始月 4 dy in number --开始日 5 ) return date is 6 begin 7 if dy = 1 then --自然月 8 if moth = 1 then --自然年 9 return dat; 10 else 11 if extract(month from dat) > moth then --非自然年 12 return dat; -- 13 14 else 15 return add_months(dat, -12); -- 16 end if; -- 17 end if; 18 19 elsif extract(day from dat) > dy then --非自然月 day在设置日期之后 20 --自然年 21 if moth = 1 then 22 return add_months(dat, 1); 23 else 24 if extract(month from add_months(dat,1)) >= moth then --非自然年 25 return add_months(dat, 1); 26 else 27 return add_months(dat, -11); 28 end if; 29 end if; 30 31 else --非自然月 day在设置日期之前 32 if moth = 1 then 33 return add_months(dat, 1); 34 else 35 if extract(month from dat) > moth then 36 return dat; 37 else 38 return add_months(dat, -12); 39 end if; 40 end if; 41 end if; 42 end;
有关财务年,需要考虑的比财务月要多,
1:自然月-自然年
2:财务月-自然年
3:自然月-财务年
4:财务月-财务年
以上四种情况都有可能会发生,其中有一些可能会有争议,需要大家自己判断。
这种写法比较麻烦,应该有更简洁的方法。欢迎大家提出。