找出每天某个时刻并发用户的数量

vyswwuz2  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(265)

找出某个时刻并发用户的数量(例如。在规定日期内每天12:00)。我的表是id,login,logout as datetime
所以我可以得到以下信息:在2018-04-01和2018-04-06之间的中午,有4个并发用户在2018-04-01 12:00,5个并发用户在2018-04-02 12:00等等。

--------------------------------------
id      login             logout  
--------------------------------------
1  2018-04-01 13:00      2018-04-02 13:00
2  2018-04-02 8:00       2018-04-04 16:00

查询2018-04-01和2018-04-03两个日期之间的12:00

-------------------------------------    
date             Number of conc.users 
--------------------------------------   
2018-04-01             0
2018-04-02             2
2018-04-03             1

这就是我得到的

set @DATE = '2018-04-01 12:00:00';
SELECT @DATE := DATE_ADD(@DATE, INTERVAL 1 DAY) AS DATE, COUNT(*) FROM Tasks WHERE start <= STR_TO_DATE(@DATE, '%Y-%m-%d %H:%i:%s') and end >= STR_TO_DATE(@DATE, '%Y-%m-%d %H:%i:%s')

为了动态地更改日期,我尝试进行重复查询,因为它是这样工作的

SELECT  '2018-04-01 12:00:00' AS DATE, COUNT(*) FROM Tasks WHERE start <= STR_TO_DATE(@DATE, '%Y-%m-%d %H:%i:%s') and end >= STR_TO_DATE(@DATE, '%Y-%m-%d %H:%i:%s')

只是一次约会

cnh2zyt3

cnh2zyt31#

像这样的事情应该可以做到: SELECT * FROM users WHERE :date BETWEEN login AND logout 编辑:由于op提供了一些样本数据和他所期望的结果,他打算做的事情就更清楚了。
我不确定纯sql解决方案是否是实现这一点的最优雅的方法,因为您必须提供一个要检查的所有可能日期的列表,如下面所述:获取两个日期之间的日期列表
但这里有一个方法:

select a.selected_date, count(u.id) as count 
from users u
join (select * from 
 (select adddate('1970-01-01 12:00',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between '2018-04-02' and '2018-04-04') as a on a.selected_date >= login and a.selected_date <= logout
group by a.selected_date

因此,基本上这会将您的所有登录会话与所提供日期范围内12:00的所有可能日期连接起来。
我还在这里创建了一个sqlfiddle:http://sqlfiddle.com/#!2012年9月4日A375B

相关问题