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处于无效状态
答案 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调用,但如果你打算多次调用它,那么它可能是值得的。