【发布时间】:2013-05-27 10:19:50
【问题描述】:
发生了一些不寻常的事情。迁移时,我有一些日期超过 2050 年(例如,20.05.2050、21.11、2051),但由于某种原因,Oracle 将它们更改为 1950、1951 等。如果你问我,这很烦人,而且是客户报告的。这些是退休日期,所以显然不能在 1950 年代和 1960 年代
原始表中的日期类似于 YYYYMMDD 格式,即 20500130。所以这是我的合并语句
MERGE INTO employment_data emp
USING temp_02 src
ON (TO_NUMBER(src.id) = emp.id)
WHEN MATCHED THEN UPDATE SET
emp.retirement_day = DECODE(TO_NUMBER(src.retirement), 0, NULL, TO_DATE(src.retirement, 'YYYY.MM.DD'));
其他日期都可以(例如 20301204),但 2050 年之后的任何日期都会出错。知道如何解决这个烦恼吗?
提前谢谢 :-)
【问题讨论】:
-
格式是什么?你提到YYYYMMDD(20500130),然后使用YYYY.MM.DD,还提到(04122030)的例子,我猜是MMDDYYYY。
-
是的,有些东西没有加起来。如果您在
2050.05.20这样的值上调用TO_NUMBER(),您将得到一个无效数字异常,因此DECODE的第一个条件应该抛出非零日期。 -
现在,有趣的部分来了。如果我从 temp_02 查询中运行 SELECT TO_DATE(retirement, 'YYYY.MM.DD') ,那么我会得到正确的结果。但是,如果我在合并查询中不解码,在数据库中插入数据并运行选择查询进行检查,那么我会看到 1950 年代被插入到数据库中。
标签: oracle plsql oracle11g plsqldeveloper