Ik zal liever het ontwerpprobleem oplossen als een permanente oplossing in plaats van tijd te verspillen aan de tijdelijke oplossing.
Ten eerste, NOOIT winkel DATUM als VARCHAR2 . Al deze overhead is te wijten aan het feit dat uw ontwerp gebrekkig is .
'20100231'
Hoe kan dat in vredesnaam een geldige datum zijn? Welke kalender heeft 31 dagen in FEBRUARI?
Volg deze stappen:
- Voeg een nieuwe kolom toe met DATE DATA TYPE.
- Update de nieuwe kolom met datumwaarden uit de oude kolom met TO_DATE .
- Voer de vereiste DATE-berekening uit in de nieuwe DATE-kolom, of verwerk dit in de UPDATE-instructie in stap 2 zelf.
- Laat de oude kolom vallen.
- Hernoem de nieuwe kolom naar de oude kolom.
UPDATE Een demo toevoegen
Instellen
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>
Nieuwe kolom toevoegen:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
DOE de vereiste update
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>
Laten we eens kijken:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Laat de oude kolom vallen:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Hernoem de nieuwe kolom naar de oude kolomnaam
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Je hebt zojuist het probleem opgelost
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>