您的第一個錯誤是將日期存儲爲varchar列。你不應該那樣做。
適合您的問題的解決方法是將列轉換爲真正的date
列。
現在我敢肯定的答案,這種說法是「我沒有設計的數據庫,我不能改變它」,所以這裏是一個解決辦法:
CAST
和to_char()
都不是一成不變的,因爲他們可以根據當前會話的設置,爲相同的輸入值返回不同的值。
如果您知道表格中所有值的格式一致(如果您有 - 可以將列轉換爲實際的date
列),那麼您可以創建自己的函數,將varchar轉換爲一個日期並被標記爲不可變。
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));
但是你有使用正是函數調用查詢以便Postgres使用它:
select *
from foo
where fix_bad_datatype(varchar_column) < current_date;
請注意,如果您的varchar列中只有一個「非法」值,則此方法將失敗。唯一明智的解決方案是存儲日期爲date
s,
有沒有辦法在pg轉換日期通過特定的格式規則?如果格式必須被猜測,SQL Server不喜歡做這樣的轉換。 – user2246674 2013-05-06 19:23:24