Oracle 日期错误 - ORA-01841

标签 oracle substr to-date sysdate

我在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 行,因此我目视检查了数据是否存在任何问题。所有日期均有效。导致此错误的原因可能是什么?

谢谢

最佳答案

显然所有日期都无效,因此您会收到错误。我会尝试类似下面的方法(未经测试,但认为可以),只是为了识别问题记录。

declare 
  v_date date;
begin
  for c in (select col_a from temp_test) loop
    begin
      v_date := to_date(substr(trim(c.col_a),7,8),'YYYYMMDD');
    exception when others then
      dbms_output.put_line(c.col_a);
    end;
  end loop;
end;

请注意,使用 others 作为唯一的异常处理程序通常被认为是不好的做法。在生产代码中,异常应该单独处理。即使用于调试,输出 SQL 错误也会更好,但对于预计只会出现少量错误的第一遍,有时偷懒也没关系。

关于Oracle 日期错误 - ORA-01841,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28829844/

相关文章:

sql - 为什么 ORACLE TO_DATE 函数在传递空格时不会在 OR 条件中给出 ORA-01841 错误?

xml - 使用 UPDATEXML 更新 Oracle 中的 XML

java - ojdbc7/ojdbc8 中的字符集问题与 ojdbc6 中的正确行为

c# - 以记录作为参数调用 Oracle 存储过程

php - 如果最后一个字符是 "/",则将其删除

hadoop - 谁能告诉我为什么在使用to_date hive (1.2版)函数时为什么会为空?

sql - ORA-01861: 文字与格式字符串不匹配

sql - 客户端如何取消事件的 Oracle 查询?

perl - 如何使用 Perl 增量打印字符串?

php - 解析简单明确定义的字符串的最有效方法?