MySQL 计算日期范围内每天的事件记录

标签 mysql

我有一个 MySQL 表,其中包含具有这些重要列的产品。

-id

-到达

-已发布

使用到达和发布的列,我想循环浏览该月的几天,例如“2017-01-01”到“2017-01-30”,并检查有多少产品是“活跃的”。这意味着它本质上会在日期范围内每天循环,并检查“2017-01-01”有多少产品处于事件状态,依此类推。

我用来检查单个日期(例如“2017-01-01”)的代码如下。

SELECT COUNT(id)
FROM products_booking
WHERE (released IS NULL OR released >= '2017-01-01') AND (arrived <= '2017-01-01')

这将返回当天“活跃”产品的数量。

但是,我希望在指定的日期范围内执行此操作,以获得一个报告,该报告将能够计算指定日期范围内每天的“活跃”产品数量。

我尝试了以下方法,但没有成功,似乎我用这种方法走上了错误的道路。

SELECT MonthDate.Date, COALESCE(COUNT(IB.id), 0) AS Total
FROM (
    SELECT 1 AS Date UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
    SELECT 11 UNION ALL
    SELECT 12 UNION ALL
    SELECT 13 UNION ALL
    SELECT 14 UNION ALL
    SELECT 15 UNION ALL
    SELECT 16 UNION ALL
    SELECT 17 UNION ALL
    SELECT 18 UNION ALL
    SELECT 19 UNION ALL
    SELECT 20 UNION ALL
    SELECT 21 UNION ALL
    SELECT 22 UNION ALL
    SELECT 23 UNION ALL
    SELECT 24 UNION ALL
    SELECT 25 UNION ALL
    SELECT 26 UNION ALL
    SELECT 27 UNION ALL
    SELECT 28 UNION ALL
    SELECT 29 UNION ALL
    SELECT 30 UNION ALL
    SELECT 31) AS MonthDate
LEFT JOIN products AS IB
ON MonthDate.Date >= DAY(IB.released) AND MonthDate.Date <= DAY(IB.arrived)
WHERE MonthDate.Date <= DAY(LAST_DAY('2017-01-30'))
GROUP BY MonthDate.Date

我也尝试过这个,但它每天都会返回“1”。

SELECT COUNT(*) cnt, MonthDate.Date
FROM  (
    SELECT 1 AS Date UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
    SELECT 11 UNION ALL
    SELECT 12 UNION ALL
    SELECT 13 UNION ALL
    SELECT 14 UNION ALL
    SELECT 15 UNION ALL
    SELECT 16 UNION ALL
    SELECT 17 UNION ALL
    SELECT 18 UNION ALL
    SELECT 19 UNION ALL
    SELECT 20 UNION ALL
    SELECT 21 UNION ALL
    SELECT 22 UNION ALL
    SELECT 23 UNION ALL
    SELECT 24 UNION ALL
    SELECT 25 UNION ALL
    SELECT 26 UNION ALL
    SELECT 27 UNION ALL
    SELECT 28 UNION ALL
    SELECT 29 UNION ALL
    SELECT 30 UNION ALL
    SELECT 31) AS MonthDate
LEFT OUTER JOIN products IB 
ON ( MonthDate.date BETWEEN IB.arrived AND IB.released)
GROUP BY MonthDate.Date;

我希望看到如下输出,其中总计是活跃产品的数量,但是日期列不是必需的。

日期总计

2017-01-01 3024

2017-01-02 3029

...

2017-01-30 2987

还有其他建议吗?

最佳答案

参见this question有关生成日期范围的信息;同样的方法应该适合你。我目前无法测试,但它看起来像:

SET @date_min = '2017-01-01';
SET @date_max = '2017-01-31';

SELECT
   dg.date,
   COUNT(pb.id) as daily_count
from (
   select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max
) date_generator dg
left join products_booking pb on (pb.released IS NULL OR pb.released >= dg.date) AND (pb.arrived <= dg.date)
GROUP BY dg.date
ORDER BY dg.date
;

关于MySQL 计算日期范围内每天的事件记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048882/

相关文章:

php - 选择包含每个唯一字段值的行并按另一个有限制的字段排序

mysql - 请安装mysql适配器: `gem install activerecord-mysql-adapter` (cannot load such file -- mysql/mysql_api)

php - 数据库查询返回: Check if a parameter is an array or an object

php - 如何使用php从特定电子邮件地址获取邮件信息并将标题信息存储到mysql数据库中

mysql - 地名数据库 : getting a full hierarchy (country -> admin1 -> admin2 -> city) with one only mysql query

php - MySQL查询根据相似标签的数量进行排名

php - 将 ORDER BY 语法附加到 php MySQL 查询

python - 在 select 的字符串格式化过程中,并非所有参数都已转换

mysql - 对两个表执行 AND 串联搜索

php - MYSQL 当 mysql_fetch_assoc =1 时不返回