You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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 起始日期;

逻辑说明

  1. 筛选可用日期:先过滤出Available = 1的记录,排除不可用日期。
  2. 生成分组键:对筛选后的日期按顺序编号,用当前日期减去对应的行号。连续的日期减去递增的行号后,会得到同一个基准日期(比如2023-09-01减1、2023-09-02减2,结果都是2023-08-31),以此作为分组依据。
  3. 聚合起止日期:按分组键聚合,取每组的最小和最大日期,就是该连续可用段的起止时间。

扩展说明

如果需要排除已预订(Booked = 1)的日期,只需调整WHERE条件:

WHERE Available = 1 AND Booked = 0

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:22:39