Это не красиво ... но вот какой-то SQL, который работает. Просто замените [Задачи] на имя вашей таблицы.
SET NOCOUNT ON
DECLARE @date DATETIME
DECLARE @continueLoop INT
DECLARE @continueInnerLoop INT
DECLARE @tmp TABLE (
[Start] [DateTime] NOT NULL ,
[End] [DateTime] NOT NULL
)
SET @continueLoop = 1
WHILE @continueLoop <> 0 BEGIN
INSERT INTO @tmp
SELECT TOP 1 [TaskStartDate], [TaskEndDate]
FROM [dbo].[Tasks]
WHERE [TaskStartDate] > ISNULL((SELECT TOP 1 [End] FROM @tmp ORDER BY [End] DESC), '19000101')
SET @continueInnerLoop = @@ROWCOUNT
WHILE @continueInnerLoop <> 0 BEGIN
UPDATE @tmp
SET [End] = Tasks.[TaskEndDate]
FROM @tmp, [dbo].[Tasks]
WHERE [End] = Tasks.[TaskStartDate]
SET @continueInnerLoop = @@ROWCOUNT
END
SELECT @continueLoop = COUNT(*)
FROM [dbo].[Tasks]
WHERE [TaskStartDate] > ISNULL((SELECT TOP 1 [End] FROM @tmp ORDER BY [End] DESC), '19000101')
END
SELECT * FROM @tmp
Результат дает следующие результаты
[TaskStartDate], [TaskEndDate]
2008-09-01 21:00:00.000, 2008-09-01 21:40:00.000
2008-09-01 22:00:00.000, 2008-09-01 22:20:00.000
2008-09-01 23:20:00.000, 2008-09-02 00:00:00.000