有关财务月和财务年的问题

工作中遇到了使用财务年和财务月的问题,现在这个问题应该很普遍了,但是我是新接触的,所以写起来比较难。

公司使用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:财务月-财务年

以上四种情况都有可能会发生,其中有一些可能会有争议,需要大家自己判断。

这种写法比较麻烦,应该有更简洁的方法。欢迎大家提出。

原文地址:https://www.cnblogs.com/com-xiaolanchong/p/5702498.html