Mysql生成连续时间段记录
原创
©著作权归作者所有:来自51CTO博客作者Shen Liang的原创作品,请联系作者获取转载授权,否则将追究法律责任
需求说明
基于某个起始日期值,比如‘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;
结果展示
