检测Oracle 11g数据库中的无效日期(ORA-01847)

时间:2015-09-03 16:14:51

标签: sql oracle date oracle11g

我正在查询Oracle 11.2实例以构建一个小型数据集市,其中包括提取出生日期和人员死亡日期。

不幸的是,INSERT查询(从SELECT中获取数据)由于ORA-01847而失败(月中的某一天必须在1月到最后一天之间)。

为了找到我的第一次做错日期:

SELECT extract(day FROM SOME_DT_TM), 
       extract(month FROM SOME_DT_TM),
       COUNT(*)
  FROM PERSON
 GROUP BY extract(day FROM SOME_DT_TM), extract(month FROM SOME_DT_TM)
 ORDER BY  COUNT(*) DESC;

它给了我367行,一年中的每一天包括NULL和2月29日(闰年)。对于其他日期列也是如此,因此从SELECT角度来看,数据看起来很好。

但是如果我在我的插页上设置了登录

 create table registry_new_dates 
                 (some_dob date, some_death_date date);
 exec dbms_errlog.create_error_log('SOME_NEW_DATES');

然后运行我的长插入查询:

SELECT some_dob,some_death_date,ora_err_mesg$ FROM ERR$_SOME_NEW_DATES;

我得到以下奇怪的结果(显示前3行),这让我觉得邮政编码已经以某种方式插入而不是第2列的日期。

31-DEC-25  35244  "ORA-01847: day of month must be between 1 and last day of month"
13-DEC-33  35244-3402  "ORA-01847: day of month must be between 1 and last day of month"
23-JUN-58  35235  "ORA-01847: day of month must be between 1 and last day of month"

我的问题是 - 如何使用SQL语句检测这些坏行(有11个显然是这样),以便我可以修复或删除它们。将它们固定在原始表中不是一种选择(没有写权限)。我尝试使用这样的查询:

SELECT DECEASED_DT_TM 
  FROM WH_CLN_PERSON 
 WHERE DECEASED_DT_TM LIKE '35%' 
   AND rownum<3;

但它没有发现有问题的行。

1 个答案:

答案 0 :(得分:0)

不确定您是否仍在积极研究此问题(或者您已经得到答案)。

要查找包含错误数据的行,您不能选择DOB 死亡日期,并根据DOB表达WHERE子句 - 如下所示: ...在哪里some_dob = to_date('31 -DEC-25') ?找到这些行后,您可能只想对这些行中的一行或两行执行另一个查询,包括计算列:dump(死亡日期)。然后张贴。我们可以从转储中学到很多东西 - 所谓的“日期”的内部表示(很可能是邮政编码)。有了这些,我们就可以弄清楚存储的内容以及如何搜索它。