Pierwszym błędem było zapisanie daty jako kolumny varchar. Nie powinieneś tego robić.
Właściwym rozwiązaniem problemu jest przekonwertowanie kolumny na rzeczywistą date
kolumna .
Teraz jestem prawie pewien, że odpowiedź na to stwierdzenie brzmi:„Nie zaprojektowałem bazy danych i nie mogę jej zmienić”, więc oto obejście:
CAST
i to_char()
nie są niezmienne, ponieważ mogą zwracać różne wartości dla tej samej wartości wejściowej w zależności od ustawień bieżącej sesji.
Jeśli wiesz, że masz spójny format wszystkich wartości w tabeli (co – gdybyś miał – oznaczałoby, że możesz przekonwertować kolumnę na rzeczywistą date
kolumna), następnie możesz utworzyć własną funkcję, która konwertuje varchar na datę i jest oznaczona jako niezmienna.
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
/
Dzięki tej definicji możesz utworzyć indeks na wyrażeniu:
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
Ale masz aby użyć dokładnie tego wywołania funkcji w zapytaniu, aby Postgres go używał:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
Zauważ, że to podejście nie powiedzie się, jeśli masz tylko jedną „nielegalną” wartość w kolumnie varchar. Jedynym sensownym rozwiązaniem jest aby przechowywać daty jako date
s,