CREATE TABLE #temp
(
FName NVARCHAR(10) ,
FStartDate DATETIME ,
FEndDate DATETIME
);
INSERT #temp
( FName, FStartDate, FEndDate )
VALUES ( '1#', '2022-04-12 08:00:00', '2022-04-12 17:00:00' )
, ( '2#', '2022-04-12 08:00:00', '2022-04-12 13:00:00' )
, ( '3#', '2022-04-12 12:00:00', '2022-04-12 17:00:00' )
, ( '4#', '2022-04-12 08:00:00', '2022-04-12 17:00:00' );
CREATE TABLE #tempdate
(
FName NVARCHAR(10) ,
FStartDate DATETIME ,
FEndDate DATETIME
);
DECLARE @FName NVARCHAR(20) ,
@FStartDate DATETIME ,
@FEndDate DATETIME;
/* 声明游标,默认为FORWARD_ONLY游标 */
DECLARE cur CURSOR
FOR
SELECT *
FROM #temp;
/* 打开游标 */
OPEN cur;
/* 读取第1行数据*/
FETCH NEXT FROM cur INTO @FName, @FStartDate, @FEndDate;
WHILE @@FETCH_STATUS = 0 /* 用WHILE循环控制游标活动 */
BEGIN
WITH qj
AS ( SELECT FDate ,
ROW_NUMBER() OVER ( ORDER BY t.FDate ) FIndex
FROM ( SELECT FStartDate FDate
FROM #temp
WHERE FStartDate >= @FStartDate
AND FStartDate <= @FEndDate
UNION ALL
SELECT FEndDate
FROM #temp
WHERE FEndDate >= @FStartDate
AND FEndDate <= @FEndDate
) t
GROUP BY FDate
)
INSERT #tempdate
( FName ,
FStartDate ,
FEndDate
)
SELECT @FName ,
a.FDate ,
b.FDate
FROM qj a
LEFT JOIN qj b ON b.FIndex = a.FIndex + 1
WHERE b.FDate IS NOT NULL;
/* 在循环体内将读取其余行数据 */
FETCH NEXT FROM cur INTO @FName, @FStartDate, @FEndDate;
END;
/* 关闭游标 */
CLOSE cur;
/* 删除游标 */
DEALLOCATE cur;
SELECT * FROM #temp a
LEFT JOIN #tempdate b ON b.FName=a.FName
OUTER APPLY(SELECT COUNT(oa.FName) num FROM #temp oa WHERE oa.FName!=a.FName AND oa.FStartDate<=b.FStartDate AND oa.FEndDate >=b.FEndDate)o
DROP TABLE #temp;
DROP TABLE #tempdate