Risolverò piuttosto il problema di progettazione come soluzione permanente invece di perdere tempo con la soluzione alternativa.
Innanzitutto, MAI memorizzare DATA come VARCHAR2 . Tutto questo sovraccarico è dovuto al fatto che il tuo design è imperfetto .
'20100231'
Come diavolo potrebbe essere una data valida? Quale calendario ha 31 giorni a FEBBRAIO?
Segui questi passaggi:
- Aggiungi una nuova colonna con DATE DATA TYPE.
- Aggiorna la nuova colonna con i valori di data dalla vecchia colonna utilizzando TO_DATE .
- Esegui l'aritmetica DATE richiesta sulla nuova colonna DATE o gestiscila nell'istruzione UPDATE nel passaggio 2 stesso.
- Elimina la vecchia colonna.
- Rinomina la nuova colonna nella vecchia colonna.
AGGIORNAMENTO Aggiunta di una demo
Configurazione
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>
Aggiungi nuova colonna:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
FAI l'aggiornamento richiesto
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>
Controlliamo:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Elimina la vecchia colonna:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Rinomina la nuova colonna con il nome della colonna precedente
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Hai appena risolto il problema
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>