簡體   English   中英

ORA-01843:具有有效SQL查詢的無效月份

[英]ORA-01843: not a valid month with valid SQL query

我正在嘗試獲取current dateweek numberweek number first date in the week last 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)頁面中會引發相同的異常。 提前致謝。

您正在調用帶有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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM