1

2 つの指定された期間の間の 1 時間ごとの間隔を取得する CTE ベースのクエリがあります。私のクエリは次のように機能します:

開始日時と終了日時を取得すると (2011 年 7 月 13 日 00:21:09 と 2011 年 7 月 31 日 21:11:21 としましょう)、1 時間ごとの合計クエリ値が取得されます (ここでは 00 から 21 までです)。合計 21 時間ですが、これはパラメトリックであり、入力に与えた時間によって異なります)。このクエリはうまく機能しますが、問題があります。時間単位の金額を表示しますが、開始時刻については、00:21:09 から 00:59:59 ではなく、毎日 00:00:00 から 00:59:59 までのすべてのクエリを取得し、終了時刻にも同じことが適用されます。 、21:00:00 と 21:11:21 ではなく、毎日 21:00:00 と 22:00:00 の間のすべてのクエリを取得します。-ちなみに、03:00 から 04:00 などの他の時間間隔は現在、通常どおり取得されます。分と秒は提供されず、1 時間のフラット間隔のみです-どうすれば修正できますか? クエリは以下です、ありがとう。

WITH cal AS (
    SELECT generate_series('2011-02-02 00:00:00'::timestamp , '2012-04-01 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 >= '07-13-2011 00:21:09' AND calltime <='07-31-2011 21:11:21' AND date_part('hour', calltime) >= 0 AND date_part('hour', calltime) <= 21
        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 >= '07-13-2011 00:00:00' AND cal.stamp<='07-31-2011 21:11:21' AND date_part('hour', cal.stamp) >= 0 AND date_part('hour', cal.stamp) <= 21
ORDER BY stamp ASC;

編集:

私の問題で私が意味するのは、最初の日の開始時間に 00:21:09 を指定したにもかかわらず、その日の翌日は、最初の 1 時間間隔の合計クエリ数を 00:00:00 から 00:00:00 までの合計クエリ数として計算することです。 00:21:09-01:00:00 の代わりに 01:00:00。そこから1時間ごとに合計クエリのカウントを開始します。-終了時間21:00:00-21:11:21にも同じことが当てはまります。クエリ結果の最後の日のみがこの間隔を取り、他の日はクエリが実行されます21:00:00 ~ 21:11:21 ではなく、21:00:00 ~ 22:00:00 の間のすべてのクエリをカウントすることで、21 ~ 22 時間の間をカウントします。

たとえば、2011 年 7 月 14 日 (開始日である 7 月 13 日の翌日) の 00:00:00 から 01:00:00 の間に 200 件のクエリがあり、00:21:09 から 01 の間には 159 件のクエリがあるとします。 00:00、200 ではなく 159 のクエリを取得する必要があります。また、ランダムな日の 21:00:00 から 22:00:00 の間に 300 のクエリがあり、そのうちの 123 が 21:00:00 から 21 の間にある場合:11:21、結果として 300 件ではなく 123 件のクエリを取得する必要があります。 . これはパラメトリックな 1 時間ごとの間隔であり、開始時間と終了時間はユーザーの入力に依存します。

4

1 に答える 1

1

ブロックに追加AND calltime::time >= '00:21:09' AND calltime::time <= '21:11:21'すると、問題が解決しました。WHERE calltime >= '07-13-2011 00:21:09' AND calltime <='07-31-2011 21:11:21'

于 2012-08-14T23:54:42.787 に答える