求助:MSSQL如何查询连续可用日期的起止时间段
MSSQL提取连续可用日期段的最优查询语句
针对你的需求,最优方案是利用窗口函数生成分组键,将连续的可用日期归为同一组,再通过聚合函数提取每组的起止日期,无需逐行对比相邻记录,效率更高。
核心查询语句
SELECT MIN(CalendarDate) AS 起始日期, MAX(CalendarDate) AS 结束日期, -- 直接生成你需要的日期范围格式 CONCAT(FORMAT(MIN(CalendarDate), 'dd/MM/yyyy'), '-', FORMAT(MAX(CalendarDate), 'dd/MM/yyyy')) AS 日期范围 FROM ( SELECT CalendarDate, -- 关键逻辑:连续日期的分组键值一致 DATEADD(DAY, -ROW_NUMBER() OVER (ORDER BY CalendarDate), CalendarDate) AS 分组键 FROM Calendar WHERE Available = 1 -- 仅筛选可用日期 ) AS 分组后日期 GROUP BY 分组键 ORDER BY 起始日期;
逻辑说明
- 筛选可用日期:先过滤出
Available = 1的记录,排除不可用日期。 - 生成分组键:对筛选后的日期按顺序编号,用当前日期减去对应的行号。连续的日期减去递增的行号后,会得到同一个基准日期(比如2023-09-01减1、2023-09-02减2,结果都是2023-08-31),以此作为分组依据。
- 聚合起止日期:按分组键聚合,取每组的最小和最大日期,就是该连续可用段的起止时间。
扩展说明
如果需要排除已预订(Booked = 1)的日期,只需调整WHERE条件:
WHERE Available = 1 AND Booked = 0
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

