I have a table named #MySchedule
with columns StartTime
, EndTime
and duration
.
What I need is a query to get all time Slots for each row in MySchedule between these StartTime and EndTime based on the duration column.
MySchedule table:
create table #MySchedule
(
startTime datetime,
endtime datetime,
duration int
)
insert into #MySchedule
select '1/3/15 10:00 AM' startTime ,'1/3/15 4:00 PM' endTime ,15 duration
union all
select '1/4/15 10:00 AM' startTime ,'1/4/15 2:00 PM' endTime ,30 duration
union all
select '1/5/15 10:00 AM' startTime ,'1/5/15 4:00 PM' endTime ,45 duration
Expected output:
Slots StartTime EndTime
1 '1/3/15 10:00 AM' '1/3/15 10:15 AM'
2 '1/3/15 10:15 AM' '1/3/15 10:30 AM'
3 '1/3/15 10:30 AM' '1/3/15 10:45 AM'
4 '1/3/15 10:45 AM' '1/3/15 11:00 AM'
5 '1/3/15 11:00 AM' '1/3/15 11:15 AM'
. ... ...
. '1/3/15 3:45 PM' '1/3/15 4:00 PM'
---------------------------------------------
. '1/4/15 10:00 AM' '1/4/15 10:30 AM'
. '1/4/15 10:30 AM' '1/4/15 11:00 AM'
. ... ...
. '1/4/15 13:30 AM' '1/4/15 14:00 PM'
---------------------------------------------
. '1/5/15 10:00 AM' '1/5/15 10:45 AM'
. '1/5/15 10:45 AM' '1/5/15 11:30 AM'
. ... ...
. '1/5/15 15:15 AM' '1/5/15 16:00 PM'
Best Answer
This will work for up to 100 intervals. It can be easily expanded to 1000 by adding another
CROSS JOIN inc
, and so on for 10.000 ...It supposes that the duration is in minutes.
CROSS JOIN
CTE inc twice and creates 10*10 rows.ROW_NUMBER()
.Query:
Output: