DECLARE @t TABLE (OfficeId INT, WeekdayId INT, StartTime TIME, EndTime TIME)INSERT INTO @tSELECT 1, 2, '14:30', '16:30'UNION ALL SELECT 1, 3, '16:00', '18:00';WITH Tally (n) AS ( SELECT TOP 100 30*(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1) FROM sys.all_columns)SELECT OfficeID, WeekdayID ,TSStart=DATEADD(minute, n, StartTime) ,TSEnd=DATEADD(minute, n + 30, StartTime) ,Timeslot=CONVERT(VARCHAR(100), DATEADD(minute, n, StartTime), 0) + ' - ' + CONVERT(VARCHAR(100), DATEADD(minute, n + 30, StartTime), 0)FROM @tCROSS APPLY ( SELECT n FROM Tally WHERE n BETWEEN 0 AND DATEDIFF(minute, StartTime, DATEADD(minute, -30, EndTime))) aORDER BY OfficeID, WeekdayID, TSStart