postgresql dbをクエリして、日付が特定の月と年である結果を返します。つまり、1か月のすべての値が必要です。
これまで私がそれを行うことができた唯一の方法は次のとおりです:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
この問題は、テーブルをクエリする前に最初の日付と最後の日付を計算する必要があることです。これを行う簡単な方法はありますか?
ありがとう
postgresql dbをクエリして、日付が特定の月と年である結果を返します。つまり、1か月のすべての値が必要です。
これまで私がそれを行うことができた唯一の方法は次のとおりです:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
この問題は、テーブルをクエリする前に最初の日付と最後の日付を計算する必要があることです。これを行う簡単な方法はありますか?
ありがとう
回答:
日付(と時刻)を使用すると、多くのことが簡単になります>= 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
これには、テーブル内のすべての行の条件の計算(スキャン)と、一致する行の範囲を見つけるためのインデックスの使用(範囲検索)が含まれます。
2014-12-01&2015-01-01。2番目もインデックス化できますが、それは簡単なことではありませんEXTRACT()。
PostreSQL 9.2以降、範囲タイプがサポートされています。だからあなたはこれを次のように書くことができます:
SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date
これは文字列比較よりも効率的です
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'
Betweenキーワードは、日付に対して例外的に機能します。日付の時刻は00:00:00(つまり、午前0時)であると想定しています。
ドキュメントをお読みください。
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。