web-dev-qa-db-ja.com

開始タイムスタンプの時間が終了タイムスタンプの時間よりも短い場合のクエリの取得

与えられた2つのタイムスタンプ間の時間間隔を取得するCTEベースのクエリがあります。私のクエリは次のように機能します:

  1. 開始日時と終了日時の取得(2011年7月13日10:21:09および2011年7月31日15:11:21としましょう)

  2. 指定されたタイムスタンプの各時間間隔内のクエリの総数を取得します。 (たとえば、ここでは、7月13日から31日まで毎日、10時から15時までの合計クエリが時間間隔で取得されます(10:21:09から11:00、11:00から11:59、12:00から12:59 ...、15:00から15:11:21)

クエリはこれです:

;WITH cal AS 
    (
        SELECT generate_series('2-2-2011 00:00:00'::timestamp, 
            '1-4-2012 05:00:00'::timestamp, 
            '1 hour'::interval) AS stamp
    )
, qqq AS (
        SELECT date_trunc('hour', calltime) AS stamp
            , count(*) AS zcount
        FROM mytable
    WHERE calltime >= '13-7-2011 10:21:09' 
        AND calltime <= '31-7-2011 15:11:21' 
        AND calltime::time >= '10:00:00' 
        AND calltime::time <= '15:59:59' 
        AND date_part('hour', calltime) >= 8 
        AND date_part('hour', calltime) <= 15
    GROUP BY date_trunc('hour', calltime)
)
SELECT cal.stamp
    , COALESCE (qqq.zcount, 0) AS zcount
FROM cal
    LEFT JOIN qqq ON cal.stamp = qqq.stamp
WHERE cal.stamp >= '13-7-2011 10:00:00' 
    AND cal.stamp <= '31-7-2011 15:11:21' 
    AND date_part('hour', cal.stamp) >= 10 
    AND date_part('hour', cal.stamp) <= 15
ORDER BY stamp ASC;

結果のスニペットは次のようになります(zcountの値は異なりますが、これは質問の編集中のコピーアンドペーストの副産物です)

stamp                 zcount
"2011-07-13 10:00:00"  123
"2011-07-13 11:00:00"  338
"2011-07-13 12:00:00"  184
"2011-07-13 13:00:00"  298
"2011-07-13 14:00:00"  162
"2011-07-13 15:00:00"  293
"2011-07-14 10:00:00"  216
"2011-07-14 11:00:00"  392
"2011-07-14 12:00:00"  268
"2011-07-14 13:00:00"  483
"2011-07-14 14:00:00"  327
"2011-07-14 15:00:00"  419
.
.
.
"2011-07-31 10:00:00"  216
"2011-07-31 11:00:00"  392
"2011-07-31 12:00:00"  268
"2011-07-31 13:00:00"  483
"2011-07-31 14:00:00"  327
"2011-07-31 15:00:00"  419

私のクエリは、最初のタイムスタンプの時間が2番目のタイムスタンプよりも小さい入力(たとえば、ここでは、最初のタイムスタンプの時間は午前10時、2番目のタイムスタンプの時間は3 PMです。

ただし、07-13-2011 22:11:43や07-31-2011 04:06:04などの入力の1時間間隔ごとのクエリの合計数を取得する場合-10のクエリ数を取得します:午後11時43分から午後10時59分まで、午後11時から午後11時59分まで...、午前3時から午後3時59分まで、午前4時から午前4時6分04秒まで、毎日問題があります。

入力で指定された日ごとに、次のようなクエリの総数を取得する必要があります。

    stamp                 zcount
    "2011-07-13 22:00:00"  123
    "2011-07-13 23:00:00"  338
    "2011-07-14 00:00:00"  184
    "2011-07-13 01:00:00"  298
    "2011-07-13 02:00:00"  162
    "2011-07-13 03:00:00"  293
    "2011-07-14 04:00:00"  216
    "2011-07-14 22:00:00"  392
    "2011-07-14 23:00:00"  268
    "2011-07-15 00:00:00"  483
    "2011-07-15 01:00:00"  327
    "2011-07-15 02:00:00"  419
    "2011-07-15 03:00:00"  121
    "2011-07-15 04:00:00"  231
     .
     . 
    "2011-07-30 22:00:00"  392
    "2011-07-30 23:00:00"  268
    "2011-07-31 00:00:00"  483
    "2011-07-31 01:00:00"  327
    "2011-07-31 02:00:00"  419
    "2011-07-31 03:00:00"  544
    "2011-07-31 04:00:00"  231

上記のように両方のタイムスタンプのケースで機能することを確認するために、クエリで何を変更する必要がありますか?

現在、2番目のケースの回避策を使用していますが、1つのクエリですべてを処理したいと考えています。

4
sm90901

Erwin Brandstetter が指摘したように、 stackoverflow.com/q/12379598/93986 のクロスポスト。解決しました。

1
sm90901