zoukankan      html  css  js  c++  java
  • 有关财务月和财务年的问题

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

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

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

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

  • 相关阅读:
    Java--泛型
    Java--文档注释
    Java--网络编程
    Java--序列化
    Java--多线程编程
    Java--ConcurrentHashMap原理分析
    HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
    面向接口编程详解
    面向接口编程
    base64 数据加密
  • 原文地址:https://www.cnblogs.com/com-xiaolanchong/p/5702498.html
Copyright © 2011-2022 走看看