我有一个 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/