【发布时间】:2017-08-23 14:25:52
【问题描述】:
为什么这个 SQL 查询有效:
SELECT NEXT_DAY(SYSDATE, 7)
FROM DUAL;
NEXT_DAY(SYSDATE,7) ------------------- 01-APR-17 1 row selected.
...但是这个匿名的 PL/SQL 块不起作用?
DECLARE
dteExpires DATE;
BEGIN
dteExpires := NEXT_DAY(SYSDATE, 7);
END;
Error at line 1 ORA-01846: not a valid day of the week ORA-06512: at line 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;
BANNER -------------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production PL/SQL Release 12.1.0.2.0 - Production CORE 12.1.0.2.0 Production TNS for 64-bit Windows: Version 12.1.0.2.0 - Production NLSRTL Version 12.1.0.2.0 - Production 5 rows selected.
【问题讨论】:
-
11g XE 中的行为相同。
标签: sql oracle date plsql oracle12c