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

时间:2018-04-09 12:03:25

标签: mysql sql

在提供的日期内找出每天某个时刻(f.ex.12点)的并发用户数。我拥有的表是id,login,logout as datetime

所以我可以得到以下:在2018-04-01和2018-04-06之间的中午,在2018-04-01 12:00有4个并发用户,在2018-04-02 12:00有5个用户。

--------------------------------------
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')

但只是一个日期

1 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

SELECT * FROM users WHERE :date BETWEEN login AND logout

编辑:由于OP提供了一些样本数据,并且他预计结果会更清楚他打算做什么。

我不确定SQL唯一的解决方案是否是最优雅的方法,因为您必须提供您想要检查的所有可能日期的列表,如下所述:Get a list of dates between two dates

但这是一种如何运作的方式:

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/#!9/4a375b/12

相关问题