Lỗi đầu tiên của bạn là lưu trữ ngày dưới dạng cột VARCHAR. Bạn không nên làm điều đó.
Sửa lỗi thích hợp cho sự cố của bạn là chuyển cột thành cột date
thực.
Bây giờ tôi khá chắc chắn câu trả lời cho tuyên bố đó là "Tôi không thiết kế cơ sở dữ liệu và tôi không thể thay đổi nó", vì vậy đây là một cách giải quyết:
CAST
và to_char()
không bất biến vì họ có thể trả về các giá trị khác nhau cho cùng một giá trị đầu vào tùy thuộc vào cài đặt của phiên hiện tại.
Nếu bạn biết bạn có định dạng nhất quán của tất cả các giá trị trong bảng (nếu bạn có - nghĩa là bạn có thể chuyển cột thành cột date
thực) thì bạn có thể tạo hàm của riêng mình để chuyển đổi một varchar thành một ngày và được đánh dấu là không thay đổi.
create or replace function fix_bad_datatype(the_date varchar)
returns date
language sql
immutable
as
$body$
select to_date(the_date, 'yyyy-mm-dd');
$body$
ROWS 1
/
Với định nghĩa rằng bạn có thể tạo một chỉ mục trên các biểu hiện:
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
Nhưng bạn có để sử dụng một cách chính xác rằng chức năng cuộc gọi trong truy vấn của bạn để Postgres sử dụng nó:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
Lưu ý rằng cách tiếp cận này sẽ không thành công nếu bạn chỉ có một giá trị "bất hợp pháp" trong cột VARCHAR của bạn. Giải pháp hợp lý duy nhất là để lưu trữ ngày là date
s,
Nguồn
2013-05-06 19:37:47
Có cách nào để chuyển đổi ngày qua một quy tắc định dạng cụ thể không? SQL Server không muốn thực hiện các chuyển đổi như vậy nếu định dạng phải được đoán. – user2246674