Prefiero solucionar el problema de diseño como una solución permanente en lugar de perder el tiempo en la solución alternativa.
En primer lugar, NUNCA tienda FECHA como VARCHAR2 . Toda esta sobrecarga se debe al hecho de que su diseño es defectuoso .
'20100231'
¿Cómo diablos podría ser una fecha válida? ¿Qué calendario tiene 31 días en FEBRERO?
Sigue estos pasos:
- Agregue una nueva columna con TIPO DE DATOS DE FECHA.
- Actualice la nueva columna con valores de fecha de la columna anterior usando TO_DATE .
- Haga la aritmética de FECHA requerida en la nueva columna FECHA, o maneje esto en la instrucción ACTUALIZAR en el paso 2 mismo.
- Elimine la columna anterior.
- Cambie el nombre de la columna nueva a la columna anterior.
ACTUALIZAR Agregar una demostración
Configuración
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>
Añadir nueva columna:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
HAZ la actualización requerida
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>
Veamos:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Elimine la columna anterior:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Cambie el nombre de la columna nueva al nombre de la columna anterior
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Acabas de solucionar el problema
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>