4

假设我的表如下所示:

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)

这甚至可以通过单个查询来实现吗?

4

2 回答 2

1

这是一个很好的开始。这适用于任何日期/时间范围。但是,它有一个主要的先决条件:您需要创建一个包含您正在扫描的所有间隔 intervals的字段的表。dt_hr datetime

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 序列的临时表。有关执行此操作的方法, 请参阅获取两个日期之间的日期列表。

于 2012-08-07T23:58:36.470 回答
0

更多的是一个重要的评论而不是答案。

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) 上加入回会话

然后是 Hour(CTS.StartTime) - Hour(sessions.start_dts) 和 cte.endtime 和 start_dts 之间的时间差模数

也许...

于 2012-08-07T23:46:54.180 回答