Oracle
 sql >> Database >  >> RDS >> Oracle

controlla la data valida dichiarata in varchar2

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:

  1. Aggiungi una nuova colonna con DATE DATA TYPE.
  2. Aggiorna la nuova colonna con i valori di data dalla vecchia colonna utilizzando TO_DATE .
  3. Esegui l'aritmetica DATE richiesta sulla nuova colonna DATE o gestiscila nell'istruzione UPDATE nel passaggio 2 stesso.
  4. Elimina la vecchia colonna.
  5. 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>