sql-server - 如果结束日期在一个间隔处为空,我如何合并它们之间的日期差异
问题描述
嗨,请帮我解决这个问题
此代码将合并所有非空日期它们之间的差异一天一次时期
---------------------------------------------------------------------------
-- Data
---------------------------------------------------------------------------
DECLARE @Test TABLE
(
startDate DATE,
ENDDate DATE,
EmpName NVARCHAR(MAX),
EmpID INT
);
INSERT INTO @Test
VALUES
( '2001-01-10', '2001-01-20' , 'yanal', 1 )
INSERT INTO @Test
VALUES
( '2001-01-21', '2001-02-10' , 'yanal', 1 )
INSERT INTO @Test
VALUES
( '2001-02-21', '2001-03-10' , 'abd', 2 )
INSERT INTO @Test
VALUES
( '2001-03-11', '2001-03-20' , 'abd', 2 )
INSERT INTO @Test
VALUES
( '2001-04-11', '2001-05-20' , 'raed', 3 )
INSERT INTO @Test
VALUES
( '2001-05-21', '2001-06-10' , 'raed', 3 )
INSERT INTO @Test
VALUES
( '2001-6-11',null, 'raed', 3 )
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
;WITH CTE
AS (SELECT p1.StartDate,
p1.EndDate,
p1.EmpName,
p1.EmpID
FROM @Test p1
LEFT JOIN @Test p2
ON p1.StartDate = DATEADD(DAY, 1, p2.EndDate)
AND p1.EmpID = p2.EmpID
WHERE p1.EndDate IS NULL
OR p2.StartDate IS NULL
UNION ALL
SELECT p1.StartDate,
p2.EndDate,
p1.EmpName,
p1.EmpID
FROM CTE p1
INNER JOIN @Test p2
ON p1.EndDate = DATEADD(DAY, -1, p2.StartDate)
AND p1.EmpID = p2.EmpID)
SELECT StartDate,
MAX(EndDate) AS EndDate,
EmpName
FROM CTE
GROUP BY StartDate,
EmpName;
输出查询
StartDate EndDate EmpName
2001-02-21 2001-03-20 abd
2001-04-11 2001-06-10 raed
2001-06-11 NULL raed
2001-01-10 2001-02-10 yanal
我需要将一个期间员工合并到一个期间
成为输出
StartDate EndDate EmpName
2001-02-21 2001-03-20 abd
2001-04-11 NULL raed
2001-01-10 2001-02-10 yanal
谢谢你
解决方案
这不是一个非常优雅的解决方案,但它确实有效。我添加了一个额外的 CTE。
DECLARE @Test TABLE
(
startDate DATE,
ENDDate DATE,
EmpName NVARCHAR(MAX),
EmpID INT
);
INSERT INTO @Test
VALUES
( '2001-01-10', '2001-01-20' , 'yanal', 1 )
INSERT INTO @Test
VALUES
( '2001-01-21', '2001-02-10' , 'yanal', 1 )
INSERT INTO @Test
VALUES
( '2001-02-21', '2001-03-10' , 'abd', 2 )
INSERT INTO @Test
VALUES
( '2001-03-11', '2001-03-20' , 'abd', 2 )
INSERT INTO @Test
VALUES
( '2001-04-11', '2001-05-20' , 'raed', 3 )
INSERT INTO @Test
VALUES
( '2001-05-21', '2001-06-10' , 'raed', 3 )
INSERT INTO @Test
VALUES
( '2001-6-11',null, 'raed', 3 )
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
;WITH CTE
AS (SELECT p1.StartDate,
p1.EndDate,
p1.EmpName,
p1.EmpID
FROM @Test p1
LEFT JOIN @Test p2
ON p1.StartDate = DATEADD(DAY, 1, p2.EndDate)
AND p1.EmpID = p2.EmpID
WHERE p1.EndDate IS NULL
OR p2.StartDate IS NULL
UNION ALL
SELECT p1.StartDate,
p2.EndDate,
p1.EmpName,
p1.EmpID
FROM CTE p1
INNER JOIN @Test p2
ON p1.EndDate = DATEADD(DAY, -1, p2.StartDate)
AND p1.EmpID = p2.EmpID)
, CTE_2 AS
(
SELECT StartDate,
MAX(CASE WHEN EndDate IS NULL THEN '29991231' ELSE ENDDate END) AS EndDate,
EmpName
FROM CTE
GROUP BY StartDate,
EmpName
)
SELECT EmpName,
MIN (StartDate) AS StartDate,
CASE WHEN EndDate = '29991231' THEN NULL ELSE EndDate END AS EndDate
FROM CTE_2
GROUP BY EmpName, CASE WHEN EndDate = '29991231' THEN NULL ELSE EndDate END
ORDER BY EmpName
推荐阅读
- python - 在python中记录文件名和行号
- excel - 如何在excel VBA中使数组为空
- c# - 在 ARM64 CPU 上运行 .NET 5.0 应用程序
- excel - 比较来自 Excel 中不同文件的日期
- java - 世界中的织物替换块创建幽灵块
- mysql - MYSQL 函数 STR_TO_DATE
- swift - 在 Swift 中将浮点价格字符串转换为 Int 表示
- node.js - Windows 恢复点后找不到模块 typescript.js。我正在尝试构建我的角度应用程序
- asp.net - 在 Hotchocolate GraphQL 中组织查询、变异和订阅类的最佳实践和有效方法是什么
- r - 如果 R 中有许多 NA,则合并行数据