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

Adi*_* N. 0 sql oracle plsql oracle-apex

我想取current date,week number,first 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;
Run Code Online (Sandbox Code Playgroud)

也尝试使用sysdate并且仅在SQL中有效但在PL/SQL(Oracle Apex)页面中抛出相同的异常.提前致谢.

MT0*_*MT0 6

你在呼唤TO_DATE( date_string, format_model )一个DATE(而不是字符串),这将导致甲骨文做的隐式转换DATEVARCHAR2使用NLS_DATE_FORMAT会话参数作为格式的模型,所以您可以将其转换回DATE.

所以查询:

TO_DATE(CURRENT_DATE,'MM/DD/YYYY')
Run Code Online (Sandbox Code Playgroud)

有效:

TO_DATE(
  TO_CHAR(
    CURRENT_DATE,
    ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
  ),
  'MM/DD/YYYY'
)
Run Code Online (Sandbox Code Playgroud)

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

你应该做的是没有使用TO_DATE上的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;
Run Code Online (Sandbox Code Playgroud)