Seu primeiro erro foi armazenar uma data como uma coluna varchar. Você não deveria fazer isso.
A correção adequada para seu problema é converter a coluna em uma
date
real coluna . Agora tenho certeza de que a resposta para essa declaração é "Eu não projetei o banco de dados e não posso alterá-lo", então aqui está uma solução alternativa:
CAST
e to_char()
não são imutáveis porque podem retornar valores diferentes para o mesmo valor de entrada, dependendo das configurações da sessão atual. Se você sabe que tem um formato consistente de todos os valores na tabela (o que - se você tivesse - significaria que você pode converter a coluna em uma
date
real column) então você pode criar sua própria função que converte um varchar em uma data e é marcada como imutável. 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
/
Com essa definição você pode criar um índice na expressão:
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
Mas você tem para usar exatamente essa chamada de função em sua consulta para que o Postgres a use:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
Observe que essa abordagem falhará muito se você tiver apenas um valor "ilegal" em sua coluna varchar. A única solução sensata é para armazenar datas como
date
s,