आपकी पहली त्रुटि एक तारीख को वर्चर कॉलम के रूप में संग्रहीत करना था। तुम्हें वह नहीं करना चाहिए।
आपकी समस्या का उचित समाधान यह है कि कॉलम को वास्तविक 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
. के रूप में स्टोर करने के लिए एस,