Postgresql
當開始時間戳的小時小於結束時間戳的小時時檢索查詢
我有一個基於 CTE 的查詢,我在其中檢索兩個給定時間戳之間的每小時間隔。我的查詢工作如下:
- 獲取開始和結束日期時間(假設 07-13-2011 10:21:09 和 07-31-2011 15:11:21)
- 檢索給定時間戳的每小時間隔內的查詢總數。(例如在這裡,每天從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的交叉文章。解決了。