ошибка ORA-01841: (полный) год должен быть между -4713 и +9999 и не должен быть 0 при загрузке данных в формате ггггммдд - PullRequest
0 голосов
/ 21 марта 2019

Оператор ниже выдает ошибку на 11-Jan-2019 мы проверяем значение paydate как 20190111, и оно корректно из источника. но все равно код выдает ошибку.

ORA-01841: (полный) год должен быть в диапазоне от -4713 до +9999, а не 0

 INSERT   INTO <New_TABLE_NAME>
        SELECT   *
        FROM     <old_table_name>
        WHERE    paydate =TO_DATE(e_paydate,'YYYYMMDD');

1 Ответ

0 голосов
/ 21 марта 2019
TO_DATE( date_string, format_model )

Принимает строку в качестве первого аргумента. Предполагая, что paydate является типом данных DATE, вы просите Oracle неявно преобразовать paydate из DATE в строку (которая будет использовать параметр сеанса NLS_DATE_FORMAT), а затем передать его в TO_DATE функция преобразования его обратно в дату.

Итак, ваш запрос эффективен:

SELECT   *
FROM     <old_table_name>
WHERE    paydate =TO_DATE(
                    TO_CHAR(
                      paydate,
                      ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
                    ),
                    'YYYYMMDD'
                  );

Если NLS_DATE_FORMAT не соответствует YYYYMMDD, вы либо получите исключение, либо неожиданное поведение.

Вместо этого, если вы хотите сравнить дату с самим собой и выяснить, находится ли ее компонент времени в полночь, просто используйте TRUNC:

SELECT   *
FROM     <old_table_name>
WHERE    paydate = TRUNC( paydate );
...