Kesalahan pertama Anda adalah menyimpan tanggal sebagai kolom varchar. Anda tidak harus melakukan itu.
Perbaikan yang tepat untuk masalah Anda adalah mengonversi kolom menjadi date
yang sebenarnya kolom .
Sekarang saya cukup yakin jawaban untuk pernyataan itu adalah "Saya tidak mendesain database dan saya tidak dapat mengubahnya", jadi inilah solusinya:
CAST
dan to_char()
tidak dapat diubah karena mereka dapat mengembalikan nilai yang berbeda untuk nilai input yang sama tergantung pada pengaturan sesi saat ini.
Jika Anda tahu bahwa Anda memiliki format yang konsisten dari semua nilai dalam tabel (yang - jika ada - berarti Anda dapat mengonversi kolom menjadi date
yang sebenarnya kolom) maka Anda dapat membuat fungsi Anda sendiri yang mengubah varchar menjadi tanggal dan ditandai sebagai tidak dapat diubah.
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
/
Dengan definisi tersebut Anda dapat membuat indeks pada ekspresi:
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
Tapi Anda memiliki untuk menggunakan panggilan fungsi itu dalam kueri Anda sehingga Postgres menggunakannya:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
Perhatikan bahwa pendekatan ini akan gagal total jika Anda hanya memiliki satu nilai "ilegal" di kolom varchar Anda. Satu-satunya solusi yang masuk akal adalah untuk menyimpan tanggal sebagai date
s,