Ich werde lieber das Designproblem beheben als dauerhafte Lösung, anstatt Zeit mit der Problemumgehung zu verschwenden.
Erstens, NIEMALS DATUM speichern als VARCHAR2 . All dieser Overhead ist auf die Tatsache zurückzuführen, dass Ihr Design fehlerhaft ist .
'20100231'
Wie um alles in der Welt könnte das ein gültiges Datum sein? Welcher Kalender hat 31 Tage im FEBRUAR?
Befolgen Sie diese Schritte:
- Fügen Sie eine neue Spalte mit DATE DATA TYPE hinzu.
- Aktualisieren Sie die neue Spalte mit Datumswerten aus der alten Spalte mit TO_DATE .
- Führen Sie die erforderliche DATE-Arithmetik für die neue DATE-Spalte durch oder behandeln Sie dies in der UPDATE-Anweisung in Schritt 2 selbst.
- Löschen Sie die alte Spalte.
- Benennen Sie die neue Spalte in die alte Spalte um.
AKTUALISIEREN Hinzufügen einer Demo
Einrichtung
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>
Neue Spalte hinzufügen:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
Führen Sie das erforderliche Update durch
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>
Überprüfen wir:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Löschen Sie die alte Spalte:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Benennen Sie die neue Spalte in den alten Spaltennamen um
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Sie haben das Problem gerade behoben
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>