[oracle自定义函数]根据年份查询指定季度的最后一天

通过sql查询指定年份下给定季度的最后一天,如传入2018年的1季度,则返回2018-03-31

这个在oracle中没有特定的函数可以直接实现这个功能

 

select add_months(trunc(to_date('2018-01-01', 'yyyy-mm-dd') + 1, 'q'), 1 * 3) - 1 as resultDay from dual;

 

把以上的sql封装成oracle函数,以后直接调用就能返回结果,sql如下:

 

CREATE OR REPLACE FUNCTION "FN_QLASTDAY" (vcyear in varchar2, --年度
                                        vcquarter in varchar2 --季度
                                          ) return date is
  resultDay date;--结果
--根据年份,查询指定季度的最后一天
begin
  select add_months(trunc(to_date(vcyear||'-01-01', 'yyyy-mm-dd') + 1, 'q'), to_number(vcquarter)*3) - 1 into resultDay from dual;
  return resultDay;
end;

调用方法:

 

--示例:查询2018年1季度的最后一天
select fn_qlastday('2018','1') from dual;

参考链接
https://zhidao.baidu.com/question/560061332.html
http://blog.csdn.net/zutsoft/article/details/44985969

其实,还有一种比较简单的写法,因为其中没有涉及2月,不需要内部函数计算,使用decode建立一个对应关系就行

CREATE OR REPLACE FUNCTION "FN_QLASTDAY" (vcyear in varchar2, --年度
                                        vcquarter in varchar2 --季度
                                          ) return date is
  resultDay date;--结果
--查询每个季度的最后一天
begin
  select to_date(vcyear||'-'||decode(vcquarter,'1','03-31','2','06-30','3','09-30','4','12-31'),'yyyy-mm-dd') into resultDay from dual;
  return resultDay;
end;

 

2018-07-16更新说明:

非常感谢wmx8518细心地发现这个存储过程得到的日期有问题,之前的语句是

select add_months(trunc(to_date('2018', 'yyyy') + 1, 'q'), 1 * 3) - 1 as resultDay from dual;

本来这个语句的逻辑是:在指定日期,向后推n个季度,得到第n个季度的最后一天

而这句话是以当前日期为基准,显然有问题。实际应该以该年度的第一天为基准,所以语句应该改为:

select add_months(trunc(to_date('2018-01-01', 'yyyy-mm-dd') + 1, 'q'), 1 * 3) - 1 as resultDay from dual;

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值