Tôi muốn khắc phục sự cố thiết kế như một giải pháp khắc phục vĩnh viễn thay vì lãng phí thời gian cho giải pháp.
Thứ nhất, KHÔNG BAO GIỜ cửa hàng DATE dưới dạng VARCHAR2 . Tất cả chi phí này là do thiết kế của bạn có sai sót .
'20100231'
Làm thế quái nào mà ngày đó lại có thể là một ngày hợp lệ? Lịch nào có 31 ngày trong THÁNG 2?
Làm theo các bước sau:
- Thêm một cột mới với LOẠI DỮ LIỆU NGÀY.
- Cập nhật cột mới với các giá trị ngày từ cột cũ bằng TO_DATE .
- Thực hiện phép tính DATE bắt buộc trên cột DATE mới hoặc xử lý điều này trong câu lệnh UPDATE ở chính bước 2.
- Bỏ cột cũ.
- Đổi tên cột mới thành cột cũ.
CẬP NHẬT Thêm bản trình diễn
Thiết lập
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>
Thêm cột mới:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
LÀM cập nhật được yêu cầu
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>
Hãy kiểm tra:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
Bỏ cột cũ:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
Đổi tên cột mới thành tên cột cũ
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
Bạn vừa khắc phục sự cố
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>