У меня есть следующая таблица в Oracle11g.Ошибка даты Oracle - ORA-01841
SQL> DESC tmp_test;
Name Type Nullable Default Comments
-------------------- ------------- -------- ------- --------
SERNO NUMBER(10)
CARDNO VARCHAR2(25) Y
COL_A VARCHAR2(255) Y
DATEA DATE Y
DATEB DATE Y
TAG VARCHAR2(255) Y
FEEDBACK CHAR(1) Y
SQL>
SQL> SELECT * FROM (SELECT T.COL_A FROM TEMP_TEST T ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <=10;
COL_A
--------------------------------------------------------------------------------
00 OK.20150301-0000
00 OK.20150301-0000
00 OK.20150301-0000
00 OK.20150205-0000
00 OK.20150301-0000
00 OK.20150301-0000
00 OK.20150213-0000
00 OK.20150301-0000
00 OK.20150129-0000
00 OK.20150301-0000
10 rows selected
SQL>
Я пытаюсь определить все строки в таблице TEMP_TEST где DATE в col_a меньше SYSDATE - 7.
SQL>
SQL> SELECT * FROM TEMP_TEST T WHERE
TO_DATE(SUBSTR(TRIM(T.COL_A),7,8),'YYYYMMDD') < sysdate-7;
**ORA-01841: (full) year must be between -4713 and +9999, and not be 0**
SQL>
В таблице содержат только 200 строк, поэтому я визуально проверить на любые вопросы с данными. Все даты действительны. Что может быть причиной этой ошибки?
Благодаря
Можете ли вы попробовать добавить 'nls_date_language' в' to_date'? Попробуйте это: SELECT TO_DATE (SUBSTR (TRIM ('00 OK.20150301-0000 '), 7,8),' YYYYMMDD ',' NLS_DATE_LANGUAGE = AMERICAN ') FROM dual; ' –
Если бы я был вами, выполните 'select SUBSTR (TRIM (T.COL_A), 7,8), 'YYYYMMDD' из temp_test', а затем проверим, что возвращается. Обычно этого достаточно, чтобы идентифицировать проблематичные строки. – Boneist
SELECT TO_DATE (SUBSTR (TRIM ('00 OK.20150301-0000 '), 7,8),' YYYYMMDD ',' NLS_DATE_LANGUAGE = AMERICAN ') FROM dual; Выбрана 1 строка. OK выберите SUBSTR (TRIM (T.COL_A), 7,8), 'YYYYMMDD' из temp_test - выбрано всего 270 строк. – MrM