ORA-01843: 不是具有有效 SQL 查询的有效月份

Posted

技术标签:

【中文标题】ORA-01843: 不是具有有效 SQL 查询的有效月份【英文标题】:ORA-01843: not a valid month with valid SQL query 【发布时间】:2018-04-26 07:50:01 【问题描述】:

我正在尝试获取 current dateweek numberfirst date in the weeklast date in the week。它下面的 SQL 语句正在运行,但是当我在 Oracle Apex 中运行时,我得到 ORA-01843: not a valid month

declare
    date_value        char;
    week_value        pls_integer;
    start_date_value  char;
    end_date_value    char;
begin 
    SELECT 
         TO_CHAR(TRUNC(TO_DATE(CURRENT_DATE,'MM/DD/YYYY')),'DD.MM.YYYY')
    ,    TO_NUMBER(TO_CHAR(TO_DATE(CURRENT_DATE,'MM/DD/YYYY'),'WW'))
    ,    TO_CHAR(TRUNC(TO_DATE(CURRENT_DATE,'MM/DD/YYYY'), 'IW'),'DD.MM.YYYY')
    ,    TO_CHAR(NEXT_DAY(TRUNC(TO_DATE(CURRENT_DATE,'MM/DD/YYYY'),'IW'),'SUNDAY'),'DD.MM.YYYY') 
    INTO 
        date_value
    ,   week_value
    ,   start_date_value
    ,   end_date_value
    FROM DUAL;

    htp.p('<< '||'Week'|| week_value ||' >> '|| start_date_value ||' - '|| end_date_value);
end;

还尝试使用 sysdate 并且仅在 SQL 中有效,但在 PL/SQL (Oracle Apex) 页面中会引发相同的异常。 提前致谢。

【问题讨论】:

如果 CURRENT_DATE 是当前日期,并且是日期数据类型,为什么要通过 TO_DATE 函数运行它?上面有固定格式的图片,这将导致基于格式图片的 NLS 设置的隐式日期到字符串转换,这可能与转换回来的格式图片不匹配。 谢谢@Andrew。 ORACLE - ORA-01843: not a valid month的可能重复 【参考方案1】:

您使用DATE(不是字符串)调用TO_DATE( date_string, format_model ),这会导致Oracle 使用NLS_DATE_FORMAT 会话参数作为格式模型将DATE 隐式转换为VARCHAR2您可以将其转换回DATE

所以查询:

TO_DATE(CURRENT_DATE,'MM/DD/YYYY')

有效:

TO_DATE(
  TO_CHAR(
    CURRENT_DATE,
    ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
  ),
  'MM/DD/YYYY'
)

如果 NLS_DATE_FORMATMM/DD/YYYY 匹配,那么您的查询将起作用 - 格式不匹配因此不起作用。

您应该做的不是在 DATE 数据类型上使用 TO_DATE - 它已经是 DATE 所以您不需要。

declare
    date_value        char(10) := TO_CHAR( CURRENT_DATE, 'DD.MM.YYYY' );
    week_value        pls_integer := TO_NUMBER(TO_CHAR(CURRENT_DATE,'WW'));
    start_date_value  char(10) := TO_CHAR(TRUNC(CURRENT_DATE, 'IW'),'DD.MM.YYYY');
    end_date_value    char(10) := TO_CHAR(NEXT_DAY(TRUNC(CURRENT_DATE,'IW'),'SUNDAY'),'DD.MM.YYYY');
begin 
    htp.p('<< '||'Week'|| week_value ||' >> '|| start_date_value ||' - '|| end_date_value);
end;

【讨论】:

非常感谢。我没有这样想,但它更简单。

以上是关于ORA-01843: 不是具有有效 SQL 查询的有效月份的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01843 - 不是有效的月份 oracle SQL

ORA-01843: 不是一个有效的月份

不是有效的月份 - SQL ORA-01843 - 在 unix 中

ORA-01843: 不是有效的月份 JPA

ORACLE - ORA-01843: 不是一个有效的月份

ORA-01843 不是有效月份 - 比较日期