Đây là một kịch bản khá bất thường (mặc dù tôi đã từng gặp điều gì đó tương tự một lần trước đây). Vấn đề phổ biến hơn là tìm ngày không hợp lệ được giữ dưới dạng chuỗi trong cột ngày. Bạn có thể điều chỉnh giải pháp cho điều đó cho phù hợp với tình huống của mình, bằng cách xây dựng trình xác thực ngày tháng của riêng bạn.
Một cái gì đó như thế này:
create or replace function is_a_date
( p_date in date )
return varchar2
is
d date;
begin
d := to_date(to_char(p_date, 'SYYYYMMDDHH24MISS'), 'SYYYYMMDDHH24MISS') ;
if d != p_date then
return 'not a proper date';
else
return 'good date';
end if;
exception
when others then
return 'not a date';
end;
/
Điều này chuyển đổi một ngày thành một chuỗi và quay lại một lần nữa. Nó bắt các ngoại lệ được ném ra bởi ngày đúc. Nếu sản phẩm cuối cùng không giống với ngày nhập thì có lẽ điều gì đó đã bị mất trong bản dịch; thành thật mà nói, tôi không chắc liệu ngày tháng 12011 có được truyền thành công đến một chuỗi hay không, vì vậy đây là một cách tiếp cận thắt lưng. Sẽ hơi phức tạp khi viết tiện ích này mà không có một số dữ liệu thử nghiệm!
Truy vấn này sẽ xác định tất cả các ngày không hợp lệ:
select h.id, dump(h.bid_close_date)
from mytable h
where h.bid_close_date is not null
and is_a_date(h.bid_close_date) != 'good date';