如何使用MySql中的单个查询按小时进行细分?

如何使用MySql中的单个查询按小时进行细分?,mysql,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/

假设我的桌子是这样的:

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)
数据如下所示:

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)
我需要查询结果如下所示:

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)

一个查询就可以做到这一点吗?

与其说是答案,不如说是一个大评论

MySQL做得不够好,但是 CTE在开始和结束数据之间提供一组日期时间 所以你得到了

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 然后是小时(CTS.StartTime)-小时(sessions.start\u dts) 以及cte.endtime和start\u dts之间的时间差模数(以分钟为单位)


也许…

这是一个很好的开始。这适用于任何日期/时间范围。但是,它有一个主要的先决条件:您需要创建一个
interval
表,其中包含一个
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'
-

选择日期格式(interval.dt_hr,“%m/%d/%Y”)作为日期,
提取(时间间隔中的小时数)作为小时,
案例
当interval.dt_hr>TIMESTAMPADD(小时、小时(s2.开始时间)、日期(s2.开始时间))
和interval.dt_hrTIMESTAMPADD(小时、小时(s2.start_dts)、日期(s2.start_dts))
然后提取(s2.end\U dts的分钟数)
当interval.dt_hr=TIMESTAMPADD(小时、小时(s2.开始_dts)、日期(s2.开始_dts))
和interval.dt_hr=TIMESTAMPADD(小时、小时(s2.end_dts)、日期(s2.end_dts))
然后提取(s2.end\U dts的分钟数)-提取(s2.start\U dts的分钟数)
其他0
以分钟结束在线
每隔一段时间
左加入会话s2
在interval.dt_hr>=TIMESTAMPADD(小时、小时(s2.start_dts)、日期(s2.start_dts))

和interval.dt_hr check out@Matthew:这里的主要问题是使用2个日期作为输入生成N行。生成数据后,无需进一步分组即可使用's@zerkms你说得对,我误解了这个问题。问得好。如果我有mysql可用,我会非常感兴趣地尝试解决它。这看起来很棒。我明天再跟进。