2012-08-13 89 views
1

正確檢索的開始和結束時間查詢我有我找回兩個給定的時間跨度之間每小時一班基於CTE的查詢。我的查詢工作如下:在PostgreSQL的查詢

獲取開始和結束日期時間(比如說07-13-2011 00:21:09和07-31-31 21:11:21) 獲取每小時的小時總查詢值每天的時間間隔(在這裏是從00到21,總共21小時,但這是參數化的,取決於我給出的輸入的小時數)。此查詢運行良好,但存在問題。它顯示每小時金額但開始的時候,它得到所有00:00:00和○點59分59秒之間的查詢每一天,而不是0時21分09秒 - ○點59分59秒和同樣適用於結束時間它會在每天21:00:00和22:00:00之間獲取所有查詢,而不是21:00:00和21:11:21。 - 順便說一句,其他小時間隔,例如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; 

編輯:

我的意思是我的問題是,儘管在第一天給予0點21分09秒對我的出發小時,這一天以後的日子裏計算總查詢次數,在第一個小時間隔爲00間總查詢計數:00:00-01:00改爲00:00 21:09-01:00:00(順便說這應該適用於第一個小時的時間間隔爲每一天,我可以給4時30分21秒的啓動時間和一天開始計時總查詢每小時開始從那裏等 - 同樣適用於結束時間21:00:00-21:11:21,只有最後一天的查詢結果需要這個時間間隔,在查詢計數在21和22之間的前幾天,通過計算21:0之間的所有查詢0:00-22:00:00而不是21:00:00-21:11:21。

例如,如果有00:00:00和01:00:00之間200個查詢7月14日2011(第二天7月13日,在開始日期之後),但也有0點21之間的查詢159: 09 - 01:00:00,我應該得到159個查詢,而不是200個。此外,如果在任意一天的21:00到00:00:00之間有300個查詢,並且其中的123個查詢在21:00之間:00-21:11:21,我應該得到123結果而不是300結果。(這適用於每一天,其他每小時的間隔應該像往常一樣計算,如01:00-02:00,20:00- 21:00等,這是參數,每隔一小時,並開始,結束時間取決於用戶輸入 -

+0

的問題是很難理解,你可以檢查語法,並提供一些例子(期望的結果,實際結果) – leonbloy 2012-08-14 18:07:11

+0

@leonbloy增加了一個小的描述到底是編輯,讓我知道,如果它仍然不清楚。 – sm90901 2012-08-14 22:04:10

+0

@leonbloy解決了它,將它作爲答案發布 – sm90901 2012-08-14 23:54:13

回答

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'塊解決的問題。