我正在查询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;
但它没有发现有问题的行。
答案 0 :(得分:0)
不确定您是否仍在积极研究此问题(或者您已经得到答案)。
要查找包含错误数据的行,您不能选择DOB 和死亡日期,并根据DOB表达WHERE子句 - 如下所示: ...在哪里some_dob = to_date('31 -DEC-25') ?找到这些行后,您可能只想对这些行中的一行或两行执行另一个查询,包括计算列:dump(死亡日期)。然后张贴。我们可以从转储中学到很多东西 - 所谓的“日期”的内部表示(很可能是邮政编码)。有了这些,我们就可以弄清楚存储的内容以及如何搜索它。