为什么这个SQL查询工作:
SELECT NEXT_DAY(SYSDATE, 7)
FROM DUAL;NEXT_DAY(SYSDATE,7)
...but这个匿名的PL/SQL块不起作用吗?
DECLARE
dteExpires DATE;
BEGIN
dteExpires := NEXT_DAY(SYSDATE, 7);
END;错误出现在第1行ORA-01846:不是一周中有效的一天或06512:在第4行。
我不想硬编码第二个参数到英文名字的前一天。NEXT_DAY(SYSDATE, 'SATURDAY')或NEXT_DAY(SYSDATE, 'SUNDAY')等。
现在,我将使用以下工作,但我非常想知道为什么NEXT_DAY()在PL/SQL中的行为与在SQL中的行为不同。
DECLARE
dteExpires DATE;
BEGIN
-- 2017-01-01 = SUNDAY
dteExpires := NEXT_DAY(SYSDATE, TO_CHAR(TO_DATE('2017-01-01', 'YYYY-MM-DD'), 'DAY'));
END;这是我的DEV环境:
SELECT *
FROM v$version;OracleDatabase12c企业版版本12.1.0.2.0 -64位生产PL/SQL版本12.1.0.2.0 -生产核心12.1.0.2.0生产TNS为64位Windows:版本12.1.0.2.0 -生产NLSRTL版本12.1.0.2.0 -生产5行选定。
发布于 2017-03-29 22:29:58
如果您检查SQL的NEXT_DAY文档,您会发现传入一个数字来表示一周中的一天是没有文档记录的。它可以工作,不管出于什么原因,但是如果您依赖它工作,那么您将冒这样的风险:将来Oracle将更改实现以符合该函数的指定规范。(风险很小,因为Oracle并不疯狂。)
https://docs.oracle.com/database/121/SQLRF/functions118.htm#SQLRF00672
PL/SQL实现只适用于文档规范--它不接受表示一周中某一天的数字输入。
我想这是一个间接的答案。我相信你问错了问题。问题不应该是“为什么这个在PL/SQL中不能工作”,而是考虑到文档,问题应该是“为什么它在Oracle SQL中工作”。只有甲骨文才能回答这个问题。
您可能会发现OTN上的讨论很有用:https://community.oracle.com/thread/4023654
发布于 2017-03-30 05:46:32
我认为使函数NEXT_DAY独立于当前会话NLS_DATE_LANGUAGE的唯一方法是使用ISO week,而每周的第一天总是在星期一:
SELECT NEXT_DAY(SYSDATE, TO_CHAR(TRUNC(SYSDATE, 'IW')+5, 'Day'))
from dual;TRUNC(SYSDATE, 'IW')+5的意思是“下星期六”
https://stackoverflow.com/questions/43104695
复制相似问题