2011-01-25 51 views
23

我想從表中選擇數據,在日期字段「date_checked」(timestamp)上使用「like」。但我有此錯誤:PostgreSQL:在時間戳字段中選擇類似的數據

SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: timestamp without time zone 

我的要求是:

SELECT my_table.id 
FROM my_table 
WHERE my_table.date_checker LIKE '2011-01-%' 

我不想使用:

SELECT my_table.id 
FROM my_table 
WHERE my_table.date_checker >= '2011-01-01 00:00:00' 
    AND my_table.date_checker < '2011-02-01 00:00:00' 

回答

59

這一切都非常好不是 「想用」 < >和時間戳,但這些操作符可以轉換爲索引掃描,並且可以匹配字符串......呃,它可以,但是EWWWW。

好了,發生了誤差,因爲你需要使用它的字符串操作之前的時間戳顯式轉換爲字符串,例如:

date_checker::text LIKE '2011-01-%' 

那麼你可以在創建索引(date_checker::text)並且該表達式將成爲索引掃描,但.... EWWWW。

+5

+1不鼓勵使用這樣的解決方案 – 2011-01-25 23:27:41

+3

我認爲如果索引掃描是您主要關心的問題,那麼您可能會使用`LIKE`方法進行更好的更改。不平等的選擇性估計可能會很快下降。只是說... ;-) – 2011-01-26 05:14:31

+6

+1爲「EWWWWWW」:) – 2012-08-31 11:15:35

2

我不相信你可以在日期列上做like而不必先將它轉換爲字符串表示。

您可以使用查詢之間的兩個日期之間進行選擇,例如:

SELECT id FROM my_table WHERE date_checker BETWEEN '2011-01-01' AND '2011-02-01'; 
8

也許date_trunc功能會根據自己的喜好:

... WHERE date_trunc('month', my_table.date_checker) = '2011-01-01' 

你也可以把索引在那個表達上,如果需要的話。

4

如果您需要對timestamp的某個部分進行比較,那麼使用EXTRACT()函數會更好。例如:不同的「場」的

WHERE EXTRACT(YEAR FROM date_checker) = 2011 
AND EXTRACT(MONTH FROM date_checker) = 1 

詳細信息您可以從日期提取在the documentation