Ihr erster Fehler bestand darin, ein Datum als varchar-Spalte zu speichern. Das solltest du nicht tun.
Die richtige Lösung für Ihr Problem besteht darin, die Spalte in ein echtes date
umzuwandeln Spalte .
Jetzt bin ich mir ziemlich sicher, dass die Antwort auf diese Aussage "Ich habe die Datenbank nicht entworfen und ich kann sie nicht ändern" lautet, also ist hier eine Problemumgehung:
CAST
und to_char()
sind nicht unveränderlich, da sie abhängig von den Einstellungen der aktuellen Sitzung unterschiedliche Werte für denselben Eingabewert zurückgeben können.
Wenn Sie wissen, dass Sie ein konsistentes Format aller Werte in der Tabelle haben (was - wenn Sie es hätten - bedeuten würde, dass Sie die Spalte in ein echtes date
konvertieren können Spalte) dann können Sie Ihre eigene Funktion erstellen, die ein varchar in ein Datum umwandelt und als unveränderlich markiert ist.
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
/
Mit dieser Definition können Sie einen Index für den Ausdruck erstellen:
CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
Aber Sie haben um genau diesen Funktionsaufruf in Ihrer Abfrage zu verwenden, damit Postgres ihn verwendet:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
Beachten Sie, dass dieser Ansatz schlecht fehlschlägt, wenn Sie nur einen "illegalen" Wert in Ihrer varchar-Spalte haben. Die einzige vernünftige Lösung ist um Daten als date
zu speichern s,