PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

टाइमस्टैम्प पर इंडेक्स:इंडेक्स एक्सप्रेशन में फंक्शन्स को IMMUTABLE के रूप में चिह्नित किया जाना चाहिए

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL से PostgreSQL पर स्विच करना - टिप्स, ट्रिक्स और गोचास?

  2. क्या सेलेक्ट टाइप क्वेश्चन ही एकमात्र प्रकार है जिसे नेस्ट किया जा सकता है?

  3. पोस्टग्रेएसक्यूएल 11:नया क्या है

  4. PostgreSQL 13 का अवलोकन libpq sslpassword कनेक्शन पैरामीटर

  5. प्रदर्शन अंतर:INNER JOIN बनाम WHERE क्लॉज पर रखी गई शर्त