PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL cria índice no cast da string até a data


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,