2011-07-26 22 views
12

注文書が格納されたテーブルがあります。各行には、注文が行われた日時を示すタイムスタンプがあります。毎日、毎月、または1年ごとの購入数を示すレポートを作成したいと考えています。私は単純なSELECT COUNT(xxx)からtbl_orders GROUP BY tbl_orders.purchase_timeを実行して値を取得すると考えましたが、私はGROUP BYのタイムスタンプの列はできません。PostgreSQL - GROUP BYタイムスタンプの値は?

これを達成する別の方法はありますか?私は理想的にはフレキシブルなソリューションが好きなので、必要な時間枠(毎時、毎月、毎週など)を使用することができました。ご提案いただきありがとうございます!

+1

タイムスタンプ列でグループ化しようとすると、どのようなエラーが表示されますか?ここではうまくいくように見えますが、タイムスタンプはグループ化される(マイクロ秒まで、または最小限の解像度であればどれでも)同一でなければならないことに留意してください。 – Anomie

答えて

11

タイムスタンプ列によるグループ分けはここでもうまくいきますが、1マイクロ秒の差でも2つの行が一緒にグループ化されることはありません。

より大きな期間でグループ化するには、適切に切り捨てられた値を返すタイムスタンプ列の式でグループ化します。ここではto_charのようにdate_truncが便利です。

+0

date_trunc関数はまさに私が探していたものでした。ありがとう! – Shadowman

15

これは、(より読みやすい)date_trunc関数なしのトリックです。

select created_on::DATE from users group by created_on::DATE 

私たちがここでやっていることは重要ではない、この値の時間データをレンダリングDATEに元の値をキャストしています。

+1

まさに私が探していたものが、 "2016-06-27"のような日付に簡単に換算できる(*) –

+0

DATEへの型キャストタイムスタンプはGroup Byで動作するとは思わない私のために働いていない。 – hky404