如何简化SQLite生成过去指定天数日历日期列表的查询语句
SQLite 简化历史日期列表查询方案
你可以使用递归公用表表达式(CTE)替代逐行UNION拼接的写法,灵活调整参数即可生成任意天数的历史日期列表,代码如下:
WITH RECURSIVE dates(d) AS ( -- 递归起始值:过去1天的日期 SELECT DATE('now', '-1 days') UNION ALL -- 递归逻辑:每次向前推1天 SELECT DATE(d, '-1 days') FROM dates -- 终止条件:如需获取过去N天,修改下方的-7 days为-N days即可 WHERE d > DATE('now', '-7 days') ) SELECT d FROM dates ORDER BY d ASC;
方案说明
- 写法简洁,仅需修改终止条件的天数参数,即可快速生成过去任意天数的日期列表,无需新增UNION语句
- 使用
UNION ALL替代原有UNION,递归生成的日期天然无重复,避免了不必要的去重开销,性能更优 - 末尾的
ORDER BY d ASC保证输出的日期按升序排列,和你原有UNION写法的输出顺序完全一致 - 兼容性:递归CTE要求SQLite版本≥3.8.3(2014年发布的版本,绝大多数运行环境都已支持)
低版本兼容方案
如果你的运行环境使用的是不支持递归CTE的极老版本SQLite,且库内存在存储连续整数的辅助表(假设表名为nums,字段n存储1、2、3……的连续整数),可以用如下写法实现同样效果:
SELECT DATE('now', '-' || n || ' days') AS d FROM nums WHERE n <= 7 ORDER BY d ASC;
内容的提问来源于stack exchange,提问作者Freude
相关产品推荐
相关产品推荐

