通过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;