日付範囲間のPostgresqlクエリ


126

postgresql dbをクエリして、日付が特定の月と年である結果を返します。つまり、1か月のすべての値が必要です。

これまで私がそれを行うことができた唯一の方法は次のとおりです:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'

この問題は、テーブルをクエリする前に最初の日付と最後の日付を計算する必要があることです。これを行う簡単な方法はありますか?

ありがとう


間隔は常に1か月ですか、それとも、おそらく15日に開始し、翌月の7日に終了する可能性がありますか?
フラン14

回答:


202

日付(と時刻)を使用すると、多くのことが簡単になります>= start AND < end

例えば:

SELECT
  user_id
FROM
  user_logs
WHERE
      login_date >= '2014-02-01'
  AND login_date <  '2014-03-01'

この場合でも、必要な月の開始日を計算する必要がありますが、それはさまざまな方法で簡単です。

終了日も簡略化されています。ちょうど1か月追加します。28日、30日、31日などといじりません


この構造には、インデックスの使用を維持できるという利点もあります。


多くの人が次のようなフォームを提案するかもしれませんが、彼らインデックスを使用しません

WHERE
      DATEPART('year',  login_date) = 2014
  AND DATEPART('month', login_date) = 2

これには、テーブル内のすべての行の条件の計算(スキャン)と、一致する行の範囲を見つけるためのインデックスの使用(範囲検索)が含まれます。


1
最初のアプローチでは、(数日ではなく)数か月間を費やす必要があります。2014-12-012015-01-01。2番目もインデックス化できますが、それは簡単なことではありませんEXTRACT()
pozs 2014

1
間隔を使用すると、アプリケーションで日付の計算を回避できます。例:WHERE login_date> = '2014-02-01' AND login_date <'2014-02-01' :: date + INTERVAL '1 month'これでも、コードを簡略化しながらインデックスを使用します。
バスウェル

53

PostreSQL 9.2以降、範囲タイプがサポートされています。だからあなたはこれを次のように書くことができます:

SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

これは文字列比較よりも効率的です


22

誰かがここに着陸した場合に備えて... 8.1以降は次のように使用できます:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

ドキュメントから:

BETWEEN SYMMETRICは、ANDの左側の引数が右側の引数以下である必要がないことを除いて、BETWEENと同じです。そうでない場合、これらの2つの引数は自動的に入れ替えられるため、空でない範囲が常に暗示されます。


-1
SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'

Betweenキーワードは、日付に対して例外的に機能します。日付の時刻は00:00:00(つまり、午前0時)であると想定しています。


-14

ドキュメントをお読みください。

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

私はそのようなクエリを使用しました:

WHERE
(
    date_trunc('day',table1.date_eval) = '2015-02-09'
)

または

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')    

Juanitos Ingenier。


2
これは質問に正確に答えるものではありません。質問は、月と年に基づいた日付を尋ねます。
Ramの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.