Postgresql

當開始時間戳的小時小於結束時間戳的小時時檢索查詢

  • September 12, 2012

我有一個基於 CTE 的查詢,我在其中檢索兩個給定時間戳之間的每小時間隔。我的查詢工作如下:

  1. 獲取開始和結束日期時間(假設 07-13-2011 10:21:09 和 07-31-2011 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

我的查詢適用於第一個時間戳的小時小於第二個時間戳的輸入 - 例如,在這裡,第一個時間戳的小時為上午 10 點,第二個時間戳的小時為下午 3 點。

但是,當我想檢索 07-13-2011 22:11:43 和 07-31-2011 04:06:04 等輸入的每小時間隔的查詢總數時, - 這樣我就可以得到 10 之間的查詢計數:11:43 pm 到 10:59pm, 11pm 到 11:59pm,…,3:00am 到 3:59, 4:00am 到 4:06:04am 每天都有問題。

我需要在輸入中的每一天檢索如下查詢的總數:

   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

我需要在我的查詢中進行哪些更改,以確保它適用於我上面介紹的兩種時間戳情況?

我目前對第二種情況使用一種解決方法,但我想在一個查詢中處理所有這些。

正如Erwin Brandstetter所指出的,來自stackoverflow.com/q/12379598/939860的交叉文章。解決了。

引用自:https://dba.stackexchange.com/questions/24144