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