Oracle
 sql >> Base de données >  >> RDS >> Oracle

vérifier la date valide qui est déclarée dans varchar2

Je vais plutôt régler le problème de conception comme solution permanente plutôt que de perdre du temps sur la solution de contournement.

Tout d'abord, JAMAIS magasin DATE comme VARCHAR2 . Tous ces frais généraux sont dus au fait que votre conception est défectueuse .

'20100231'

Comment diable cela pourrait-il être une date valide ? Quel calendrier a 31 jours en FÉVRIER ?

Suivez ces étapes :

  1. Ajouter une nouvelle colonne avec DATE DATA TYPE.
  2. Mettre à jour la nouvelle colonne avec les valeurs de date de l'ancienne colonne en utilisant TO_DATE .
  3. Effectuez l'arithmétique DATE requise sur la nouvelle colonne DATE ou gérez-la dans l'instruction UPDATE à l'étape 2 elle-même.
  4. Supprimer l'ancienne colonne.
  5. Renommer la nouvelle colonne par l'ancienne colonne.

MISE À JOUR Ajouter une démo

Configuration

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>

Ajouter une nouvelle colonne :

SQL> ALTER TABLE t ADD (dt DATE);

Table altered.

SQL>

EFFECTUEZ la mise à jour requise

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>

Vérifions :

SQL> SELECT * FROM t;

YMD      DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101

SQL>

Supprimer l'ancienne colonne :

SQL> ALTER TABLE t DROP COLUMN ymd;

Table altered.

SQL>

Renommer la nouvelle colonne avec l'ancien nom de colonne

SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;

Table altered.

SQL>

Vous venez de résoudre le problème

SQL> SELECT * FROM t;

YMD
---------
12-NOV-10
01-JAN-15


SQL>