ORA-01843: недопустимый месяц с действительным запросом SQL - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь получить current date, week 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) бросает то же самоеисключение.Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы вызываете TO_DATE( date_string, format_model ) с DATE (не String), что заставляет Oracle выполнить неявное преобразование 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, поэтому вам не нужно.

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;
...