使用Oracle中的函数查找季度的第一天和最后一天
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;
我想要季度的第一天和第一天。但我收到错误消息:使用Oracle中的函数查找季度的第一天和最后一天
ORA-06575:包装或功能DTQRTR处于无效状态
ORA-06575
意味着你的函数有错误编译。很可能你的函数代码中有一些语法错误。从SQL * Plus(和其他一些工具),你可以通过使用显示错误:
SHOW ERROR;
或
SHOW ERROR FUNCTION dtqrtr;
在这里,我猜测是你有太多的END
语句...和,正如在下面的评论中Ben所注意到的,函数必须返回一个值。最后,你也可以在主体的第一行写入dquery
,以覆盖下一行。
是的,加上一个函数必须返回一些东西。 – Ben
@Ben是的,这是正确的。我认为OP写了'end dquery'而不是'return dquery'。 –
这应该工作...
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;
一个函数必须返回一些东西... – Ben
这段代码没有返回值.....类型RETURN(dquery)在结束之前dtqrtr;我解决了这个问题,但是这种返回类型只显示一个值,我应该怎么做才能获得多个值 – user3722544
@ user3722544 - 请不要在注释中提出其他问题 - 并且不要回过头来编辑此问题以包含第二个问题。如果您有其他问题,请发布另一个问题。谢谢。 –
你想两个值:本季度的第一天,本季度的最后一天。这对于只能返回单个值的函数来说是不合适的。然而,这两个值很容易推导与内置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这三个电话,但它可能是唯一值得的,如果你要做到这一点打了很多电话。
嗯,只要我们知道了什么错误消息是... –
ORA-06575:包装或功能DTQRTR处于无效状态 这是错误messege – user3722544
当您运行了'SELECT'就是你得到的错误查询。该功能的问题是别的。我建议你再次执行'CREATE OR REPLACE FUNCTION',然后(假设你正在使用SQLPlus)键入'SHOW ERRORS FUNCTION DTQRTR';这会显示最近编译这个函数所导致的编译错误。祝你好运。 –