你的位置:首页 > 数据库

[数据库]有关财务月和财务年的问题


---恢复内容开始---

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

公司使用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 BEGIN13 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;         --月加116 if day_id='01'                         --判断自然月17  then18  return d;19 else if nowday>=day_id                  --判断财务月应该返回的值20  then21 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   else11    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 then22    return add_months(dat, 1);23   else24    if extract(month from add_months(dat,1)) >= moth then  --非自然年25     return add_months(dat, 1);26    else27     return add_months(dat, -11);28    end if;29   end if;30 31  else                           --非自然月  day在设置日期之前32   if moth = 1 then33    return add_months(dat, 1);34   else35    if extract(month from dat) > moth then36     return dat;37    else38     return add_months(dat, -12);39    end if;40   end if;41  end if;42 end;

有关财务年,需要考虑的比财务月要多,

1:自然月-自然年

2:财务月-自然年

3:自然月-财务年

4:财务月-财务年

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

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

 

---恢复内容结束---

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

公司使用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 BEGIN13 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;         --月加116 if day_id='01'                         --判断自然月17  then18  return d;19 else if nowday>=day_id                  --判断财务月应该返回的值20  then21 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   else11    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 then22    return add_months(dat, 1);23   else24    if extract(month from add_months(dat,1)) >= moth then  --非自然年25     return add_months(dat, 1);26    else27     return add_months(dat, -11);28    end if;29   end if;30 31  else                           --非自然月  day在设置日期之前32   if moth = 1 then33    return add_months(dat, 1);34   else35    if extract(month from dat) > moth then36     return dat;37    else38     return add_months(dat, -12);39    end if;40   end if;41  end if;42 end;

有关财务年,需要考虑的比财务月要多,

1:自然月-自然年

2:财务月-自然年

3:自然月-财务年

4:财务月-财务年

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

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