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

PostgreSQL स्ट्रिंग से आज तक कास्ट पर इंडेक्स बनाता है

आपकी पहली त्रुटि एक तारीख को वर्चर कॉलम के रूप में संग्रहीत करना था। तुम्हें वह नहीं करना चाहिए।

आपकी समस्या का उचित समाधान यह है कि कॉलम को वास्तविक date में बदल दिया जाए स्तंभ

अब मुझे पूरा यकीन है कि उस कथन का उत्तर है "मैंने डेटाबेस को डिज़ाइन नहीं किया और मैं इसे बदल नहीं सकता", इसलिए यहाँ एक समाधान है:

CAST और to_char() अपरिवर्तनीय नहीं हैं क्योंकि वे वर्तमान सत्र की सेटिंग के आधार पर समान इनपुट मान के लिए अलग-अलग मान लौटा सकते हैं।

यदि आप जानते हैं कि आपके पास तालिका में सभी मानों का एक सुसंगत प्रारूप है (जो - यदि आपके पास था - तो इसका मतलब होगा कि आप कॉलम को वास्तविक date में बदल सकते हैं। कॉलम) तो आप अपना खुद का फ़ंक्शन बना सकते हैं जो एक वर्चर को एक तिथि में परिवर्तित करता है और इसे अपरिवर्तनीय के रूप में चिह्नित किया जाता है।

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));

लेकिन आपके पास है अपनी क्वेरी में ठीक उसी फ़ंक्शन कॉल का उपयोग करने के लिए ताकि पोस्टग्रेज़ इसका उपयोग कर सके:

select *
from foo
where fix_bad_datatype(varchar_column) < current_date;

ध्यान दें कि यदि आपके वर्कर कॉलम में केवल एक "अवैध" मान है तो यह दृष्टिकोण बुरी तरह विफल हो जाएगा। एकमात्र समझदार समाधान है तारीखों को 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. DELETE स्टेटमेंट में पंक्तियों के भौतिक स्थान (ROWID) का उपयोग कैसे करें

  2. JDBC का उपयोग करके फ़ाइल से PostgreSQL में डेटा कैसे कॉपी करें?

  3. एक सशर्त INSERT . से आईडी प्राप्त करें

  4. रेल पर रूबी/पीजीएसक्यूएल त्रुटि प्रारंभ:ऐसी फ़ाइल लोड नहीं कर सकता - pg_ext (LoadError)

  5. PHP PDO का उपयोग करके PostgreSQL स्कीमा सेट करने का सबसे अच्छा विकल्प