在提供的日期内找出每天某个时刻(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')
但只是一个日期
答案 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