sql >> Base de Datos >  >> RDS >> Oracle

verifique la fecha válida que se declara en varchar2

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:

  1. Agregue una nueva columna con TIPO DE DATOS DE FECHA.
  2. Actualice la nueva columna con valores de fecha de la columna anterior usando TO_DATE .
  3. 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.
  4. Elimine la columna anterior.
  5. 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>