sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL crea un índice en el lanzamiento desde la cadena hasta la fecha

Su primer error fue almacenar una fecha como una columna varchar. No deberías hacer eso.

La solución adecuada para su problema es convertir la columna en una date real columna .

Ahora estoy bastante seguro de que la respuesta a esa afirmación es "Yo no diseñé la base de datos y no puedo cambiarla", así que aquí hay una solución alternativa:

CAST y to_char() no son inmutables porque pueden devolver valores diferentes para el mismo valor de entrada según la configuración de la sesión actual.

Si sabe que tiene un formato coherente de todos los valores de la tabla (que, si lo tuviera, significaría que puede convertir la columna en una date real columna) entonces puede crear su propia función que convierte un varchar en una fecha y está marcado como inmutable.

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
/

Con esa definición puedes crear un índice en la expresión:

CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));

Pero usted tiene para usar exactamente esa llamada de función en su consulta para que Postgres la use:

select *
from foo
where fix_bad_datatype(varchar_column) < current_date;

Tenga en cuenta que este enfoque fallará gravemente si solo tiene un valor "ilegal" en su columna varchar. La única solución sensata es para almacenar fechas como date s,