簡體   English   中英

如何使用MySql中的單個查詢按小時分類?

[英]How do I get a breakdown by the hour using a single query in MySql?

假設我的表看起來像這樣:

Sessions
start_dts (datetime)
end_dts (datetime)

數據看起來像這樣:

start_dts             end_dts
12/25/2011 01:55:00   12/25/2011 03:30:00

我需要查詢結果如下所示:

Date          Hour    MinutesOnline
12/25/2011    0       0
12/25/2011    1       5
12/25/2011    2       60
12/25/2011    3       30
... (every hour of the date range being queried)

這可以通過單個查詢實現嗎?

這是一個非常好的開始。 這適用於任何日期/時間范圍。 但是,它有一個主要先決條件:您需要創建一個帶有dt_hr datetime字段的intervals表,該字段包含您掃描的所有間隔。

Ex: '2011-12-25 00:00:00',
    '2011-12-25 01:00:00',
    '2011-12-25 02:00:00',
    '2011-12-25 03:00:00',
          . . .
    '2011-12-25 23:00:00'

-

SELECT DATE_FORMAT(intervals.dt_hr,'%m/%d/%Y') AS Date,
       EXTRACT(HOUR FROM intervals.dt_hr) AS Hour,
       CASE 
          WHEN intervals.dt_hr > TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
               AND intervals.dt_hr < TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
            THEN 60
          WHEN intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
               AND intervals.dt_hr < TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
            THEN 60 - EXTRACT(MINUTE FROM s2.start_dts)
          WHEN intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
               AND intervals.dt_hr > TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
            THEN EXTRACT(MINUTE FROM s2.end_dts)
          WHEN intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
               AND intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
            THEN EXTRACT(MINUTE FROM s2.end_dts) - EXTRACT(MINUTE FROM s2.start_dts)
          ELSE 0
       END AS MinutesOnLine
FROM intervals
LEFT JOIN sessions s2 
  ON intervals.dt_hr >= TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
    AND intervals.dt_hr <= TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))

要生成intervals表,您可以創建一個存儲過程,該過程創建一個帶有date_hour序列的臨時表。 有關執行此操作的方法,請參閱獲取兩個日期之間的日期列表

更多的評論而不是回答。

使用MySQL做得不夠好但CTE要在start_dts和end_dts之間設置一組日期時間,這樣你就得到了

startTime           endTime     
12/25/2011 01:00:00 12/25/2011 02:00:00
12/25/2011 02:00:00 12/25/2011 03:00:00
12/25/2011 03:00:00 12/25/2011 04:00:00

加入CT.EndTime會議<DateAdd(sessions.end_dts,INTERVAL 1 HOUR)

然后是小時(CTS.StartTime) - 小時(sessions.start_dts)和時間差的模數,分鍾為cte.endtime和start_dts

也許...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM