在 SQL 服务器中将单列日期列表转换为多日期范围

Convert Single column list of dates into Multiple Date Range in SQL Server

我有一个业务需求,我需要将列表日期转换为日期范围 如果日期不连续,则逻辑将创建直到连续日期的日期范围,然后创建新范围 将创建

下面是示例table

  ID      Module  Employeeid   Date
    --------------------------------------------
    11      M1         9        2019-10-01 00:00:00.000 
    12      M1         9        2019-10-02 00:00:00.000 
    13      M1         9        2019-10-03 00:00:00.000 
    14      M2         9        2019-10-04 00:00:00.000 
    15      M2         9        2019-10-05 00:00:00.000
    16      M2         9        2019-10-08 00:00:00.000
    17      M2         9        2019-10-09 00:00:00.000

要求输出

  Module  Employeeid   Start Date    End Date
    ---------------------------------------------------
    M1         9        2019-10-01  2019-10-03 
    M1         9        2019-10-04  2019-10-05
    M1         9        2019-10-08  2019-10-09

下面是我试过的查询,它正在运行,但我们需要添加开始日期和结束日期过滤器 所以在添加过滤器后 OutPut 是不正确的

WITH mycte 
     AS (SELECT *, 
                Dateadd(day, -Row_number() 
                                OVER ( 
                                  partition BY [[module] 
                                  ORDER BY [Date]), [Date]) AS grp 
         FROM   [to_shiftschedule] 
         WHERE  employeeid = 535                 
               ) 
SELECT Min([Date]) AS[StartDate], 
       Max([Date]) AS[EndDate], 
       [employeeid], 
       [module] 
FROM   mycte 
where   CONVERT(VARCHAR, Date, 103) >= CONVERT(VARCHAR, '09/01/2020', 103) 
        AND CONVERT(VARCHAR, Date, 103) <= CONVERT(VARCHAR, '23/01/2020', 103)
GROUP  BY[employeeid], [module], grp 
ORDER  BY[startdate] DESC; 

如果问题出在日期过滤器,也就是这一部分,我假设

where   CONVERT(VARCHAR, Date, 103) >= CONVERT(VARCHAR, '09/01/2020', 103) 
    AND CONVERT(VARCHAR, Date, 103) <= CONVERT(VARCHAR, '23/01/2020', 103)

,原因可能是比较 varchars 而不是普通日期。

我建议您使用以下条件:

where Date >= '2020-01-09' and Date <= '2020-01-23'

顺便说一下,我还建议您编辑最后的 SQL 子句,因为不清楚您将哪一列命名为 "Date"。

请告诉我是否有帮助。