Първата ви грешка беше да съхраните дата като колона varchar. Не трябва да правите това.
Правилното решение за вашия проблем е да конвертирате колоната в реална date
колоната .
Вече съм почти сигурен, че отговорът на това твърдение е „Не съм проектирал базата данни и не мога да я променя“, така че ето заобиколно решение:
CAST
и to_char()
не са неизменни, защото могат да върнат различни стойности за една и съща входна стойност в зависимост от настройките на текущата сесия.
Ако знаете, че имате последователен формат на всички стойности в таблицата (което - ако имахте - би означавало, че можете да конвертирате колоната в реална date
колона), тогава можете да създадете своя собствена функция, която преобразува varchar в дата и е маркирана като неизменна.
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
/
С тази дефиниция можете да създадете индекс на израза:
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
Но вие имате за да използвате точно това извикване на функция във вашата заявка, така че Postgres да го използва:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
Обърнете внимание, че този подход ще се провали сериозно, ако имате само една „незаконна“ стойност във вашата колона varchar. Единственото разумно решениесто за съхраняване на датите като date
s,