Jeg vil hellere løse designproblemet som en permanent løsning i stedet for at spilde tid på løsningen.
For det første ALDRIG butik DATE som VARCHAR2 . Alt dette overhead skyldes det faktum, at dit design er mangelfuldt .
'20100231'
Hvordan i alverden kunne det være en gyldig dato? Hvilken kalender har 31 dage i FEBRUAR?
Følg disse trin:
- Tilføj en ny kolonne med DATE DATA TYPE.
- Opdater den nye kolonne med datoværdier fra den gamle kolonne ved hjælp af TO_DATE .
- Udfør den nødvendige DATE-regning i den nye DATE-kolonne, eller håndter dette i UPDATE-sætningen i selve trin 2.
- Slip den gamle kolonne.
- Omdøb den nye kolonne til den gamle kolonne.
OPDATERING Tilføjelse af en demo
Opsætning
SQL> OPRET TABEL t 2 (ymd varchar2(8));Tabel oprettet.SQL>SQL> INDSÆT ALLE 2 I t (ymd) 3 VÆRDIER ('20101112') 4 --INTO t (ymd) 5 -- VALUES ('20100231') 6 INTO t (ymd) 7 VALUES ('20150101') 8 INTO t (ymd) 9 VALUES ('20160101') 10 VÆLG * FRA dual;3 rækker oprettet.SQL COMMITSQL>;Commit complete.SQL>
Tilføj ny kolonne:
SQL> ÆNDRINGSTABEL t TILFØJ (dt DATO);Tabel ændret.SQL>
UDFØR den nødvendige opdatering
SQL> OPDATERING 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>
Lad os tjekke:
SQL> VÆLG * FRA t;YMD DT-------- ----------20101112 12-NOV-1020150101 01-JAN-1520160101SQL>
Slip den gamle kolonne:
SQL> ÆNDRINGSTABEL t SLIP KOLONNE ymd;Tabel ændret.SQL>
Omdøb den nye kolonne til det gamle kolonnenavn
SQL> ÆNDRINGSTABEL t OMNØV KOLONNE dt TIL ymd;Tabel ændret.SQL>
Du har lige løst problemet
SQL> VÆLG * FRA t;YMD---------12-NOV-1001-JAN-15SQL>