sql >> Database >  >> RDS >> Oracle

controleer op geldige datum die is aangegeven in varchar2

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:

  1. Voeg een nieuwe kolom toe met DATE DATA TYPE.
  2. Update de nieuwe kolom met datumwaarden uit de oude kolom met TO_DATE .
  3. Voer de vereiste DATE-berekening uit in de nieuwe DATE-kolom, of verwerk dit in de UPDATE-instructie in stap 2 zelf.
  4. Laat de oude kolom vallen.
  5. 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>



  1. Hoe COUNT_BIG() werkt in SQL Server

  2. Kolomnaam Oracle-tabel met spatie

  3. Geen geldige maand tijdens het invoegen van gegevens in oracle

  4. DateDiff om uren en minuten uit te voeren