Создание интервала для записи
Доброго времени суток.
Есть таблица шаблонов расписания.
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]
Нужно составить хранимую процедуру (запрос), которая возвращала бы доступное время для записи (если возможно, то одним запросом) учитывая:
- интервал приема
- уже занятое время другими записями
- дни недели. Интервалы одного 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