在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   
  ;