まず、これはCREATE INDEX
のバグかもしれないと思いました 論理。ただし、重要なのは、text
からのキャストです。 timestamptz
へ それ自体はIMMUTABLE
ではありません また。 datestyle
のような揮発性の設定に依存します 。
あなたの特定のケースでは、あなたが試したものよりもさらに良い回避策があります。キャストを関数に移動します:
CREATE OR REPLACE FUNCTION to_text(text)
RETURNS text AS
$func$
SELECT to_char($1::timestamptz AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US')
$func$ LANGUAGE sql IMMUTABLE;
同じように効率的ですが、CREATE INDEX
吠えない:
CREATE INDEX bar ON foo(to_text(j->>'start_time'));
明らかに、それに応じて関数呼び出しを調整する必要があります。キャスト::timestamptz
を削除します。 式から。 どこでも同じ設定を使用するようにしてください 、またはインデックスが誤った結果につながる可能性があります。
さらに良い
to_timestamp()
で実際に不変の式を使用する キャストの代わりに(入力パターンで許可されている場合):
CREATE OR REPLACE FUNCTION to_text(text)
RETURNS text AS
$func$
SELECT to_char(to_timestamp($1, 'YYYY-MM-DD"T"HH24:MI:SS.US') -- adapt to your pattern
AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US')
$func$ LANGUAGE sql IMMUTABLE;
ただし、注意してください(私のテストからのエラーメッセージを引用):
"TZ" / "tz"/"OF"形式のパターンはto_dateではサポートされていません