我宁愿修复设计问题作为永久解决方案,而不是在解决方法上浪费时间。
首先,NEVER store DATE as VARCHAR2。所有这些开销都是由于您的设计有缺陷.
'20100231'
这到底怎么可能是一个有效的日期呢?哪个日历的 2 月有 31 天?
按着这些次序:
- 添加具有日期数据类型的新列。
- 使用旧列中的日期值更新新列TO_DATE.
- 对新的 DATE 列执行所需的 DATE 算术,或在步骤 2 本身的 UPDATE 语句中处理此问题。
- 删除旧的列。
- 将新列重命名为旧列。
UPDATE添加演示
Setup
SQL> CREATE TABLE t
2 (ymd varchar2(8));
Table created.
SQL>
SQL> INSERT ALL
2 INTO t (ymd)
3 VALUES ('20101112')
4 --INTO t (ymd)
5 -- VALUES ('20100231')
6 INTO t (ymd)
7 VALUES ('20150101')
8 INTO t (ymd)
9 VALUES ('20160101')
10 SELECT * FROM dual;
3 rows created.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
添加新列:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
执行所需的更新
SQL> UPDATE t
2 SET dt =
3 CASE
4 WHEN to_date(ymd, 'YYYYMMDD') > SYSDATE
5 THEN NULL
6 ELSE to_date(ymd, 'YYYYMMDD')
7 END;
3 rows updated.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
让我们检查:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
删除旧列:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
将新列重命名为旧列名称
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
您刚刚解决了问题
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>