在MySQL中计算时间范围内的条目
我的数据库中有一个表,我在其中记录用户的使用时间 处于活动或非活动状态。如果用户从活动切换到非活动或 反之亦然(或更改地址等任何其他属性),则会添加新记录。简化版本如下所示:在MySQL中计算时间范围内的条目,mysql,Mysql,我的数据库中有一个表,我在其中记录用户的使用时间 处于活动或非活动状态。如果用户从活动切换到非活动或 反之亦然(或更改地址等任何其他属性),则会添加新记录。简化版本如下所示: UserID state state_from state_to 1 active 2016-12-14 2017-01-15 2 active 2016-12-14 2017-
UserID state state_from state_to
1 active 2016-12-14 2017-01-15
2 active 2016-12-14 2017-02-02
3 active 2017-01-01 NULL
1 inactive 2017-01-16 2017-03-05
2 inactive 2017-02-02 NULL
1 active 2017-03-06 NULL
我想统计一下每月有多少用户在某个时候处于“活动”状态。1月至3月的预期产出表为:
date user_count
2017-01 3
2017-02 2
2017-03 2
对于特定的时间戳(例如2017年1月),我使用以下查询
SET @stamp = '2017-01';
SELECT @stamp AS date, COUNT(UserID) AS user_count
FROM se_user
WHERE (state LIKE 'active' AND @stamp BETWEEN DATE_FORMAT(state_from,'%Y-%m') AND DATE_FORMAT(state_to,'%Y-%m') )
OR (state LIKE 'active' AND DATE_FORMAT(state_from,'%Y-%m') <= @stamp AND DATE_FORMAT(state_to,'%Y-%m') IS NULL);
您需要一个
calendar\u表
来显示月份日期范围,每个月都有dt\u begin
和dt\u end
因此,您对本年度的查询变为
SELECT c.dt_begin, count(*)
FROM calendar_table c
JOIN se_user u
ON c.dt_begin <= COALESCE(u.state_to, curdate() )
AND c.dt_end >= u.state_from
WHERE dt_begin >= '2017-01-01'
AND dt_begin <= '2017-12-01'
AND state = 'active'
GROUP BY c.dt_begin
;
选择c.dt\u开始,计数(*)
从日历表c
加入se_用户u
关于c.dt_begin=u.state_from
其中dt_开始>='2017-01-01'
然后开始
SELECT c.dt_begin, count(*)
FROM calendar_table c
JOIN se_user u
ON c.dt_begin <= COALESCE(u.state_to, curdate() )
AND c.dt_end >= u.state_from
WHERE dt_begin >= '2017-01-01'
AND dt_begin <= '2017-12-01'
AND state = 'active'
GROUP BY c.dt_begin
;