Đầu tiên, tôi nghĩ đây có thể là lỗi trong CREATE INDEX
Hợp lý. Nhưng vấn đề là diễn viên từ text
đến timestamptz
bản thân nó không phải là IMMUTABLE
hoặc. Nó phụ thuộc vào các cài đặt dễ bay hơi như datestyle
.
Trong trường hợp cụ thể của bạn, có một cách giải quyết thậm chí còn tốt hơn những gì bạn đã thử. Di chuyển dàn diễn viên vào hàm:
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;
Cũng hiệu quả, nhưng bây giờ CREATE INDEX
sẽ không ngăn cản:
CREATE INDEX bar ON foo(to_text(j->>'start_time'));
Rõ ràng, bạn phải điều chỉnh các lệnh gọi hàm của mình cho phù hợp:thả truyền ::timestamptz
từ biểu thức. Đảm bảo rằng bạn sử dụng cùng một cài đặt ở mọi nơi hoặc chỉ mục có thể dẫn đến kết quả sai.
Tốt hơn nữa
Sử dụng một biểu thức thực sự bất biến với to_timestamp()
thay vì ép kiểu (nếu mẫu nhập của bạn cho phép):
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;
Tuy nhiên, lưu ý (trích dẫn thông báo lỗi từ thử nghiệm của tôi):
Các mẫu định dạng "TZ" / "tz" / "OF" không được hỗ trợ trong to_date