むしろ設計上の問題を修正します 回避策に時間を浪費するのではなく、恒久的な修正として。
まず、決して 日付を保存する VARCHAR2として 。このオーバーヘッドはすべて、設計に欠陥があるという事実によるものです。 。
'20100231'
いったいどうしてそれが有効な日付になるのでしょうか? 2月に31日あるカレンダーはどれですか?
次の手順に従ってください:
- DATEDATATYPEで新しい列を追加します。
- TO_DATE を使用して、古い列の日付値で新しい列を更新します 。
- 新しいDATE列で必要なDATE演算を実行するか、ステップ2自体のUPDATEステートメントでこれを処理します。
- 古い列を削除します。
- 新しい列の名前を古い列に変更します。
更新 デモの追加
セットアップ
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>