【问题标题】:Detecting Invalid Dates in Oracle 11g database (ORA-01847 )检测 Oracle 11g 数据库中的无效日期 (ORA-01847)
【发布时间】:2015-11-29 14:09:32
【问题描述】:

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

很遗憾,由于 ORA-01847(一个月中的某天必须介于该月的 1 和最后一天之间),INSERT 查询(从 SELECT 中获取其数据)失败。

为了找到我第一次做的糟糕约会:

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 行),这让我认为以某种方式插入了邮政编码而不是第二列的日期。

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;

但它没有找到有问题的行。

【问题讨论】:

  • deceased_dt_tm 的数据类型是什么?
  • 第一种方法是将日期与主人员键一起插入到临时表中。您仍然应该在该插入上得到错误,但是主键然后会让您检查明显错误的行以查看发生了什么。一旦你知道它们的坏处,你就可以寻找一种方法来修复或过滤它们。
  • DECEASED_DT_TM 是一个日期
  • Zastai,这是个好主意,我会尝试并在得到结果时发布。
  • 运行了一段时间 - 但我得到了主键并调查了记录。它增加了神秘感,因为其中 3 条记录具有实际合法的外观日期,而其他记录具有该列的 (null) 条目。

标签: sql oracle date oracle11g


【解决方案1】:

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

要查找包含错误数据的行,您不能改为选择 DOB 死亡日期,并用 DOB 表示 WHERE 子句 - 如下所示: ...在哪里 some_dob = to_date('31-DEC-25') ?找到这些行后,您可能希望仅对其中一两行执行另一次查询,包括计算列:dump(date of death)。然后发布那个。我们可以从转储中学到很多东西——所谓的“日期”的内部表示(很可能是邮政编码)。有了这些,我们或许能够弄清楚存储了什么,以及如何寻找它。

【讨论】:

  • 我现在很好,我使用 Zastai 的提示来查找违规行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2016-11-22
  • 2023-03-20
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
相关资源
最近更新 更多