假设我的表看起来像这样:
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)
单个查询是否可以实现这一目标?
答案 0 :(得分: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序列的临时表。有关执行此操作的方法,请参阅Get a list of dates between two dates。
答案 1 :(得分: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
加入会话On CT.EndTime&lt; DateAdd(sessions.end_dts,INTERVAL 1 HOUR)
然后是小时(CTS.StartTime) - 小时(sessions.start_dts) 时间差的模数以分钟为单位cte.endtime和start_dts
也许...