Oracle错误与TO_DATE函数有关?

时间:2017-07-05 23:18:09

标签: oracle11g

我有一些月/年数据存储在VARCHAR2字段中,格式为MM / YYYY。 当我尝试将其转换为与WHERE子句中的其他日期进行比较的日期时,我得到“ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0”错误。

我检查了空值,没有。我用min和max函数检查了两个字符月,它们返回min ='01'和max ='12'。我检查了分隔符 - 没有位置3不是'/'的行。字段的长度始终为7.最后,使用年份位置的4个字符,我确定min ='2010'和max ='3020'。我还检查了一年中的每个角色< '0'和> '9'没有返回任何行。当我在WHERE子句中运行没有to_date的SQL但将其保留为select列时,它不会引发错误。

在这种情况下如何找到坏数据?我很难过。

字段空检查(在where子句中):

and field is null ; result is 0 rows

字段检查的长度(在where子句中):

and length(field) != 7 ; result is 0 rows

月份检查(作为选择列)

min(substr(field, 1, 2)) ; result is '01' (string)
max(substr(field, 1, 2)) ; result is '12' (string)

分隔符检查(在where子句中)

and substr(field, 3, 1) != '/'    ; result is 0 rows

年度检查(作为选择栏)

min(substr(field, 4, 4)) ; result is '2010' (string)
max(substr(field, 4, 4)) ; result is '3020' (string)

1 个答案:

答案 0 :(得分:2)

找到我的问题 - 我的WHERE子句的其他部分正在将我的注意力集中在具有GOOD数据的行上。但是,无法保证WHERE子句中的哪些项的顺序是先评估,第二,等等。所以我必须查看表中“字段”的所有数据。你不能只注释掉WHERE子句给你带来麻烦。我发现了一些field ='0/0'的行,这是我数据问题的根本原因。