这似乎是一个愚蠢的问题,但无论如何我会在这里试试运气。请参阅下面的代码块,您会看到 NEXT_DAY 在 SELECT 语句中接受1和'Sunday'作为参数,但仅在 DBMS_OUTPUT.PUT_LINE 中'星期天',并抛出错误1 - “ORA-01846:不是一周中的有效日期”。
如果我把'星期天',它的确有效。我在这里缺少什么?
declare
wday varchar(10);
begin
select to_char(next_day(sysdate,1),'Day') into wday from dual; -- <== working with 1
dbms_output.put_line (wday);
select to_char(next_day(sysdate,'Sunday'),'Day') into wday from dual; -- <== working with 'Sunday'
dbms_output.put_line (wday);
--dbms_output.put_line (to_char(next_day(sysdate,1),'Day')); -- <== not working with 1
dbms_output.put_line (to_char(next_day(sysdate,'Sunday'),'Day')); -- <== working with 'Sunday'
end;
/
PS:我的NLS配置:1 =星期日
答案 0 :(得分:2)
当数字被解释为字符串时,会发生此错误。您可以使用以下内容重现它:
SELECT to_char(next_day(sysdate, '3'), 'Day') FROM DUAL;
感谢@Ben指出,这是因为数字被PL / SQL隐式转换并且不支持。
一种解决方法是编写自己的number_to_day
函数,这样可以提高可读性,并且可以在以后使用多语言。