最初のエラーは、日付を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列に「不正な」値が1つしかない場合、このアプローチはひどく失敗することに注意してください。唯一の賢明な解決策はです 日付をdate
として保存する s、