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

时间:2018-04-26 07:50:02

标签: sql oracle plsql oracle-apex

我正在尝试抓取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)页面中抛出相同的异常。 提前谢谢。

1 个答案:

答案 0 :(得分:6)

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

所以查询:

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_FORMAT匹配,那么您的查询将有效 - 格式不匹配,因此无效。

您应该做的是在MM/DD/YYYY数据类型上使用TO_DATE - 它已经是DATE,因此您不需要。

DATE