在 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"。
请告诉我是否有帮助。
我有一个业务需求,我需要将列表日期转换为日期范围 如果日期不连续,则逻辑将创建直到连续日期的日期范围,然后创建新范围 将创建
下面是示例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"。
请告诉我是否有帮助。