Oracle
 sql >> база данни >  >> RDS >> Oracle

проверете за валидна дата, която е декларирана в varchar2

По-скоро ще поправя проблема с дизайна като постоянно решение, вместо да губите време за заобикаляне.

Първо, НИКОГА магазин ДАТА като VARCHAR2 . Всички тези режийни разходи се дължат на факта, че вашиятдизайн е дефектен .

'20100231'

Как, по дяволите, може да е валидна дата? Кой календар има 31 дни през ФЕВРУАРИ?

Следвайте тези стъпки:

  1. Добавете нова колона с ДАТА ТИП ДАННИ.
  2. Актуализирайте новата колона със стойности за дати от старата колона, като използвате TO_DATE .
  3. Извършете необходимата аритметика DATE в новата колона DATE или обработете това в оператора UPDATE в самата стъпка 2.
  4. Изхвърлете старата колона.
  5. Преименувайте новата колона на старата.

АКТУАЛИЗИРАНЕ Добавяне на демонстрация

Настройка

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>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да сравним два обекта на база данни в Oracle?

  2. Как мога да поправя тази грешка:не се поддържа SQL92?

  3. Как да използвам динамичен параметър в IN клауза на JPA именувана заявка?

  4. Разлика между времеви печати в милисекунди в Oracle

  5. Как да извикате съхранена процедура в пакет оракул с Entity Framework?