需求说明

基于某个起始日期值,比如‘2021-9-1’,生成其之后的30天数据,结果类似:

2021-09-02、2021-09-03、2021-09-04...

问题分析

该需要看似简单,但想不借助交互式SQL即WHILE循环的方式,则得考虑借助自增辅助表来实现。自增辅助表的构造有几种方法,详见代码处的介绍:

-- # Way1 借助系统表作为自增辅助
SELECT DATE_FORMAT(DATE_SUB('2021-09-01', INTERVAL -pos DAY), '%Y-%m-%d') gendate
FROM(
SELECT ORDINAL_POSITION pos FROM information_schema.`COLUMNS`
WHERE TABLE_NAME = 'table_lock_waits_summary_by_table'
AND ORDINAL_POSITION <30
)A

-- # Way2 借助系统表生成自增辅助
SELECT DATE_FORMAT(DATE_SUB('2021-09-01', INTERVAL -num DAY), '%Y-%m-%d') gendate
FROM(
SELECT @row:=@row+1 num
FROM sys.metrics a,(SELECT @row:=0) b
)A
WHERE A.num<30


-- # Way3 借助CTE生成自增序列,mysql 8及以上版本
WITH RECURSIVE cte (num) AS
(
SELECT 1
UNION ALL
SELECT num + 1 FROM cte WHERE num < 30
)
SELECT DATE_FORMAT(DATE_SUB('2021-09-01', INTERVAL -num DAY), '%Y-%m-%d') gendate
FROM cte;

结果展示 

Mysql生成连续时间段记录_自增