SQLite如何基于Days表查询当前日期往前7天、往后14天的日期
问题需求
我们需要获取距当前日期往前7天、往后14天的所有对应日期,涉及的表结构如下:
Days表结构
| ID | Day |
|---|---|
| 2 | Sunday |
| 3 | Tuesday |
| 9 | Wednesday |
| 10 | Friday |
| 8 | Thursday |
| 4 | Saturday |
原有实现为查询未来7天对应日期,使用的SQL如下:
SELECT CASE WHEN D.Day='Sunday' THEN date('now', 'localtime', 'weekday 0') WHEN D.Day='Monday' THEN date('now', 'localtime', 'weekday 1') WHEN D.Day='Tuesday' THEN date('now', 'localtime', 'weekday 2') WHEN D.Day='Wednesday' THEN date('now', 'localtime', 'weekday 3') WHEN D.Day='Thursday' THEN date('now', 'localtime', 'weekday 4') WHEN D.Day='Friday' THEN date('now', 'localtime', 'weekday 5') WHEN D.Day='Saturday' THEN date('now', 'localtime', 'weekday 6') END AS WeekDate FROM Days AS D
解决方案
可以通过生成周偏移量的方式扩展原SQL,覆盖目标时间范围,同时增加边界校验避免生成超出要求的日期,修改后的SQL如下:
SELECT CASE WHEN D.Day='Sunday' THEN date('now', 'localtime', 'weekday 0', offset||' days') WHEN D.Day='Monday' THEN date('now', 'localtime', 'weekday 1', offset||' days') WHEN D.Day='Tuesday' THEN date('now', 'localtime', 'weekday 2', offset||' days') WHEN D.Day='Wednesday' THEN date('now', 'localtime', 'weekday 3', offset||' days') WHEN D.Day='Thursday' THEN date('now', 'localtime', 'weekday 4', offset||' days') WHEN D.Day='Friday' THEN date('now', 'localtime', 'weekday 5', offset||' days') WHEN D.Day='Saturday' THEN date('now', 'localtime', 'weekday 6', offset||' days') END AS WeekDate FROM Days AS D -- 生成周偏移量:-7(上周)、0(本周)、+7(下周)、+14(下下周) CROSS JOIN (VALUES (-7), (0), (7), (14)) AS offsets(offset) -- 过滤仅保留在要求范围内的日期 WHERE WeekDate BETWEEN date('now', 'localtime', '-7 days') AND date('now', 'localtime', '+14 days') ORDER BY WeekDate;
逻辑说明
- 通过
CROSS JOIN关联偏移量列表,一次性生成四个周期对应星期的日期,覆盖往前7天到往后14天的所有可能值 - WHERE条件做二次校验,过滤掉落在边界外的日期,保证结果完全符合需求
- 逻辑和原有实现保持兼容,会自动忽略Days表中不存在的星期(本示例中为Monday)
内容的提问来源于stack exchange,提问作者srikanth
相关产品推荐
相关产品推荐

