web-dev-qa-db-ja.com

PostgreSQL:タイムスタンプフィールドに「いいね!」の付いたデータを選択します

日付フィールド「date_checked」(タイムスタンプ)に「いいね」を使用して、テーブルからデータを選択しようとしています。しかし、私はこのエラーがあります:

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'
28
Kevin Campion

タイムスタンプ付きの<と>は「使いたくない」わけではありませんが、これらの演算子はインデックススキャンと文字列一致に変換できます。

さて、タイムスタンプを文字列に変換する前に、タイムスタンプを明示的に文字列に変換する必要があるため、エラーが発生しています:

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

そしてI 仮定すると、(date_checker::text)にインデックスを作成でき、その式はインデックススキャンになりますが... EWWWW。

73
araqnid

おそらくdate_trunc関数はあなたの好みにより合っています。

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

必要に応じて、その式にインデックスを付けることもできます。

8

timestampの一部で比較を行う必要がある場合は、 EXTRACT() 関数を使用することをお勧めします。例えば:

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

日付から抽出できるさまざまな「フィールド」の詳細は、 ドキュメント にあります。

4
Scott Marlowe

最初に文字列表現に変換せずに、日付列でlikeを実行できるとは思わない。

たとえば、betweenクエリを使用して、2つの日付から選択できます。

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