【发布时间】: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) 条目。