Создание интервала для записи

Доброго времени суток.

Есть таблица шаблонов расписания.

CREATE TABLE [dbo].[Template](
    [ID] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Interval] [nvarchar](50) NULL,-- интервал приема в минутах
    [Activate] [bit] NOT NULL,-- активен шаблон или нет
) ON [PRIMARY]

Следовательно активен шаблон в любой момент только один и для каждого шаблона имеется n-ое количество интервалов расписаний

CREATE TABLE [dbo].[Schedule](
    [ID] [uniqueidentifier] NOT NULL,
    [TemplateID] [uniqueidentifier] NULL,
    [StartTime] [nvarchar](50) NULL, --начало доступного времени для записи
    [EndTime] [nvarchar](50) NULL,--конец доступного времени для записи
    [Monday] [bit] NULL,-- True или false доступна ли запись в понедельник
    [Tuesday] [bit] NULL,
    [Wednesday] [bit] NULL,
    [Thursday] [bit] NULL,
    [Friday] [bit] NULL,
    [Saturday] [bit] NULL,
    [Sunday] [bit] NULL
) ON [PRIMARY]

Так же существует таблица в которой уже хранятся записи и занятое время.

CREATE TABLE [dbo].[EventRecord](
    [ID] [uniqueidentifier] NOT NULL,
    [PeopleID] [uniqueidentifier] NULL,
    [TemplateID] [uniqueidentifier] NULL,
    [DateTime] [datetime] NULL,-- дата и время уже созданной записи
    [Interval] [nvarchar](max) NULL,
    [CheckOut] [bit] NULL,
    [Details] [nvarchar](max) NULL
) ON [PRIMARY]

Нужно составить хранимую процедуру (запрос), которая возвращала бы доступное время для записи (если возможно, то одним запросом) учитывая:

  1. интервал приема
  2. уже занятое время другими записями
  3. дни недели. Интервалы одного Schedule у меня построить получается, но как это сделать для всех Schedule одного шаблона и исключить уже то время на которое записались.
declare @intervalMinutes int = 10
declare @myDates table (
startTime datetime,
endTime datetime
)

DECLARE @startTime DATETIME = '2016-07-10 08:00'
DECLARE @endTime DATETIME = '2016-07-10 22:00'

;WITH CTE AS
(
    SELECT  @startTime st
    UNION   ALL
    SELECT  dateadd(MINUTE,@intervalMinutes,st) st
    FROM    cte
    where   dateadd(MINUTE,@intervalMinutes,st) < @endTime
)
SELECT st,dateadd(MINUTE,@intervalMinutes,st) FROM cte

Ответы (0 шт):