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 :
- Ajouter une nouvelle colonne avec DATE DATA TYPE.
- Mettre à jour la nouvelle colonne avec les valeurs de date de l'ancienne colonne en utilisant TO_DATE .
- 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.
- Supprimer l'ancienne colonne.
- 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>