По-скоро ще поправя проблема с дизайна като постоянно решение, вместо да губите време за заобикаляне.
Първо, НИКОГА магазин ДАТА като VARCHAR2 . Всички тези режийни разходи се дължат на факта, че вашиятдизайн е дефектен .
'20100231'
Как, по дяволите, може да е валидна дата? Кой календар има 31 дни през ФЕВРУАРИ?
Следвайте тези стъпки:
- Добавете нова колона с ДАТА ТИП ДАННИ.
- Актуализирайте новата колона със стойности за дати от старата колона, като използвате TO_DATE .
- Извършете необходимата аритметика DATE в новата колона DATE или обработете това в оператора UPDATE в самата стъпка 2.
- Изхвърлете старата колона.
- Преименувайте новата колона на старата.
АКТУАЛИЗИРАНЕ Добавяне на демонстрация
Настройка
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>
Добавяне на нова колона:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
НАПРАВЕТЕ необходимата актуализация
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>
Нека проверим:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Изхвърлете старата колона:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Преименувайте новата колона на старото име на колона
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Току-що отстранихте проблема
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>