MySQL生成连续时间区间日期列表的两种方法
在MySQL中进行数据统计或报表生成时,常需补齐缺失的时间节点。本文详解如何利用数学计算生成连续日期列表,并提供基于视图的重用方案,支持日、月等多种时间粒度。
结果目标:无依赖地生成连续时间列表
通常我们习惯在业务表中筛选数据,但当需要生成“过去365天”或“某段时间内的每一天”这种纯时间序列,且中间可能没有业务数据时,直接查询业务表会导致断档。我们需要一种独立于业务数据的SQL方法来填充这些空白。
准备条件:理解数字序列原理
Mysql生成连续数字的核心技巧是利用四个子查询各自包含0-9的数字,通过交叉连接(Cross Join)或逗号连接生成10000个组合(0~9999)。利用 `CURDATE()` 配合 `INTERVAL` 进行加减运算,即可推导出连续的日期。
真实操作顺序与方法
第1步:直接查询生成日期列表(一次性使用)
目的:快速获得特定起止日期范围内的每一天,不修改库结构。
核心逻辑:将十位、百位、千位的权重叠加到当前日期上。
select a.date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as date
from (select 0 as a union all select 1 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 9) as a
cross join (select 0 as a union all select 1 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) as b
cross join (select 0 as a union all select 1 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) as c
cross join (select 0 as a union all select 1 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) as d
) a
where a.date between '2020-01-20' and '2021-12-24' ORDER BY a.date asc;本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













