Регистр с датой и строкой - PullRequest
0 голосов
/ 02 июля 2018

У меня следующая ошибка, ORA-01841 (full) year must be between -4713 and +9999 and not be 0

Ошибка исходит из приведенного ниже оператора case.

Любая помощь в том, что происходит и как исправить?

SQL

SELECT
CASE 
WHEN NVL(uap.us_pend_dt, act_d_dt) >= TO_CHAR(TO_DATE('".PENDING_DATE_CUTOFF."','YYYY-MM-DD'),'mm/dd/yyyy')
THEN NVL(uap.us_pend_dt, act_d_dt)
ELSE CASE WHEN NVL(act_d_dt, SYSDATE) <TO_CHAR(TO_DATE('".HIRE_DATE_CUTOFF."','YYYY-MM-DD'),'mm/dd/yyyy')
THEN act_d_dt
ELSE ua_dt
 END
  END AS h_DT

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Похоже, вы пытаетесь преобразовать строку ".PENDING_DATE_CUTOFF." в дату. Я просто сделал следующее и получил ту же ошибку:

SELECT TO_DATE('".PENDING_DATE_CUTOFF."', 'YYYY-MM-DD') FROM dual;

Является ли .PENDING_DATE_CUTOFF. (с точками) именем столбца в вашей таблице? Если это так, пропустите символы одинарных кавычек, например ::10000

SELECT TO_DATE(".PENDING_DATE_CUTOFF.", 'YYYY-MM-DD') FROM dual;

Конечно, это даст совсем другую ошибку [ORA-00904: ".PENDING_DATE_CUTOFF.": invalid identifier], если вы запустите как есть! Поэтому я думаю, что вам может понадобиться что-то вроде следующего (я предполагаю, что другие столбцы даты являются фактическими датами, а обрезанные столбцы - это VARCHAR2 столбцы, в которых хранятся даты в формате YYYY-MM-DD:

SELECT CASE WHEN COALESCE(uap.us_pend_dt, act_d_dt) >= TO_DATE(".PENDING_DATE_CUTOFF.", 'YYYY-MM-DD') THEN COALESCE(uap.us_pend_dt, act_d_dt)
         ELSE WHEN COALESCE(act_d_dt, SYSDATE) < (TO_DATE(".HIRE_DATE_CUTOFF.", 'YYYY-MM-DD') THEN act_d_dt
         ELSE act_d_dt
       END AS h_dT
  FROM mytable;

Обратите внимание, что я также избавился от постороннего оператора CASE и преобразовал специфическую для Oracle функцию NVL() в стандартную ANSI COALESCE() функцию.

РЕДАКТИРОВАТЬ: В случае, если ваши *_dt столбцы являются строками, а не датами, лучше всего конвертировать их в даты, используя TO_DATE() до сравнения - таким образом, вы сравнение дат с датами.

Надеюсь, это поможет.

0 голосов
/ 02 июля 2018

Предположительно, ваши столбцы даты хранятся как даты. Итак, сделайте сравнение как даты , а не строки :

SELECT (CASE WHEN NVL(uap.us_pend_dt, act_d_dt) >= TO_DATE('".PENDING_DATE_CUTOFF."', 'YYYY-MM-DD')
             THEN NVL(uap.us_pend_dt, act_d_dt)
             WHEN NVL(act_d_dt, SYSDATE) < TO_DATE('".HIRE_DATE_CUTOFF."', 'YYYY-MM-DD')
             THEN act_d_dt
             ELSE ua_dt
        END) AS h_DT

Вам также не нужны дополнительные case выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...