Saya lebih suka memperbaiki masalah desain sebagai perbaikan permanen daripada membuang-buang waktu untuk solusi.
Pertama, TIDAK PERNAH simpan TANGGAL sebagai VARCHAR2 . Semua overhead ini disebabkan oleh fakta bahwa desain Anda cacat .
'20100231'
Bagaimana mungkin itu bisa menjadi tanggal yang valid? Kalender mana yang memiliki 31 hari di bulan FEBRUARI?
Ikuti langkah-langkah berikut:
- Tambahkan kolom baru dengan JENIS DATA TANGGAL.
- Perbarui kolom baru dengan nilai tanggal dari kolom lama menggunakan TO_DATE .
- Lakukan aritmatika DATE yang diperlukan pada kolom DATE yang baru, atau tangani ini dalam pernyataan UPDATE pada langkah 2 itu sendiri.
- Lepaskan kolom lama.
- Ganti nama kolom baru menjadi kolom lama.
PERBARUI Menambahkan demo
Penyiapan
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>
Tambahkan kolom baru:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
Lakukan pembaruan yang diperlukan
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>
Mari kita periksa:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Lepaskan kolom lama:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Ganti nama kolom baru menjadi nama kolom lama
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Anda baru saja memperbaiki masalah
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>