Jag ska snarare fixa designproblemet som en permanent fix snarare än att slösa tid på lösningen.
För det första, ALDRIG butik DATE som VARCHAR2 . Allt detta omkostnader beror på att din design är felaktig .
'20100231'
Hur i hela friden kan det vara ett giltigt datum? Vilken kalender har 31 dagar i FEBRUARI?
Följ dessa steg:
- Lägg till en ny kolumn med DATE DATA TYPE.
- Uppdatera den nya kolumnen med datumvärden från den gamla kolumnen med TO_DATE .
- Gör den nödvändiga DATE-arithmetiken i den nya DATE-kolumnen, eller hantera detta i UPDATE-satsen i själva steg 2.
- Släpp den gamla kolumnen.
- Byt namn på den nya kolumnen till den gamla.
UPPDATERA Lägger till en demo
Inställningar
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>
Lägg till ny kolumn:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
GÖR den nödvändiga uppdateringen
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>
Låt oss kontrollera:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Släpp den gamla kolumnen:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Byt namn på den nya kolumnen till gamla kolumnnamn
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Du har precis åtgärdat problemet
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>