Try this:WITH DigitsCTE(digit) AS( SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9), NumbersCTE(number) AS( SELECT ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) - 1 FROM DigitsCTE AS D0 CROSS JOIN DigitsCTE AS D1), MinutesCTE(minute) AS( SELECT TOP(60) number FROM NumbersCTE), HoursCTE(hour) AS( SELECT TOP(24) number FROM NumbersCTE), OneDayMinutesCTE(minute) AS( SELECT hour * 60 + minute FROM HoursCTE AS H CROSS JOIN MinutesCTE AS M), PhoneLogDaysCTE AS( SELECT date FROM (SELECT DATEADD(DAY, DATEDIFF(DAY, '20100101', StartTime), '20100101') FROM dbo.PHONE_LOG UNION ALL SELECT DATEADD(DAY, DATEDIFF(DAY, '20100101', StopTime), '20100101') FROM dbo.PHONE_LOG) AS T(date) GROUP BY date), PhoneLogVoidsCTE(void_date, group_identifier) AS( SELECT D.date, DATEADD(MINUTE, -1 * ROW_NUMBER() OVER(ORDER BY D.date), D.date) FROM (SELECT DATEADD(MINUTE, ODM.minute, PLD.date) FROM PhoneLogDaysCTE AS PLD CROSS JOIN OneDayMinutesCTE AS ODM) AS D(date) WHERE NOT EXISTS(SELECT * FROM PHONE_LOG AS PL WHERE PL.StartTime <= D.date AND PL.StopTime >= D.date))SELECT MIN(PLV.void_date) AS start_time, MAX(PLV.void_date) AS end_time FROM PhoneLogVoidsCTE AS PLV GROUP BY PLV.group_identifier ORDER BY start_time, end_time;
And let me know if it works.