MySQL生成连续时间区间日期列表的两种方法

Cora
Cora
发布时间:2026-10-16 | 5人浏览过
原创

在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;
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表