पहले मुझे लगा कि यह 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 में समर्थित नहीं हैं