Oracle
 sql >> Datenbank >  >> RDS >> Oracle

auf gültiges Datum prüfen, das in varchar2 deklariert ist

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:

  1. Fügen Sie eine neue Spalte mit DATE DATA TYPE hinzu.
  2. Aktualisieren Sie die neue Spalte mit Datumswerten aus der alten Spalte mit TO_DATE .
  3. 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.
  4. Löschen Sie die alte Spalte.
  5. 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>