使用Oracle中的函数查找季度的第一天和最后一天

时间:2015-04-12 10:49:32

标签: oracle plsql date-arithmetic

CREATE OR REPLACE FUNCTION dtqrtr(generationDate DATE)
RETURN DATE
IS
    dquery DATE;
BEGIN
    dquery := TRUNC(TO_DATE (generationDate),'YEAR');
    dquery := TRUNC(TO_DATE ( generationDate),'Q');
    dbms_output.put_line ('First_Quarter : ' || dquery || '   '||'Last_Quarter : ' || add_months(dquery -1,3));
END dquery;

END dtqrtr;

SELECT dtqrtr('20-JAN-2015')
FROM DUAL;

我想要一年,季度的第一天和最后一天。但是我收到错误消息:

  

ORA-06575:包裹或功能DTQRTR处于无效状态

3 个答案:

答案 0 :(得分:1)

ORA-06575表示您的函数编译时出错。很可能在您的功能代码中存在一些语法错误。从SQL * Plus(以及其他一些工具),您可以使用以下方法显示错误:

SHOW ERROR;

SHOW ERROR FUNCTION dtqrtr;

在这里,我的猜测你有太多的END语句...而且,正如Ben在评论中注意到的那样,函数必须返回一个值。最后,你在身体的第一行放入dquery的东西,在下一行覆盖它是很奇怪的。

答案 1 :(得分:1)

这应该有用......

CREATE OR REPLACE FUNCTION dtqrtr(generationDate DATE)
RETURN DATE
IS
    dquery DATE;
BEGIN
    dquery := TRUNC(TO_DATE (generationDate),'YEAR');
    dquery := TRUNC(TO_DATE ( generationDate),'Q');
    dbms_output.put_line ('First_Quarter : ' || dquery || '   '||'Last_Quarter : ' || add_months(dquery -1,3));
    RETURN dquery;
END dtqrtr;
/

SELECT dtqrtr('20-JAN-2015')
FROM DUAL;

答案 2 :(得分:0)

您需要两个值:季度的第一天和季度的最后一天。这不适合函数,只能返回单个值。但是,使用内置SQL函数可以轻松导出这两个值:

with cte as ( select date '2015-01-20' dt from dual )
select trunc(dt, 'Q') as qtr_st
       , last_day(add_months(trunc(dt, 'Q'),2)) as qtr_end
from cte
/

你可以考虑在用户定义的函数中包含这三个QTR_END调用,但如果你打算多次调用它,那么它可能是值得的。