【发布时间】:2015-05-03 23:43:32
【问题描述】:
我在Oracle11g中有下表。
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 中 COL_A 中的 DATE 小于 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' from temp_test然后检查返回的内容。通常这足以识别有问题的行。 -
SELECT TO_DATE(SUBSTR(TRIM('00 OK.20150301-0000'),7,8),'YYYYMMDD', 'NLS_DATE_LANGUAGE = AMERICAN') FROM dual;已选择 1 行。 OK select SUBSTR(TRIM(T.COL_A),7,8),'YYYYMMDD' from temp_test -- 全部 270 行被选中。
标签: oracle substr to-date sysdate