2011-01-25 4 views
23

"date_checked"のような "date_checked"(タイムスタンプ)を使用して、テーブルからデータを選択しようとしています。しかし、私はこのエラーを持っている: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そのようなソリューションの使用を妨げている場合 –

+3

インデックススキャンが主な関心事であるとすれば、あなたはおそらく「好き」アプローチでより良い変更を行うと思います。不等式の選択率の推定はかなり早く落ちる可能性があります。ちょっと言って... ;-) –

+6

+1の "EWWWWW" :) –

2

文字列表現に最初に変換せずに、日付列にlikeを行うことはできません。

あなたは、例えば、2つの日付の間を選択するためのクエリの間で使用することができます。

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

日付欄に好きなようにすることができます –

+0

@KevinCampion:いいえ、そうではありません。まずそれを変換せずに。 – Patrick

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です。

+0

または日付の最初のx部分のようなものが必要な場合はdate_trunc。 '2011-01-13 12:15:23'を '2011-01-01 00:00:00'にすることができます –

関連する問題