1. Уточнение проблемы
После разъяснений ОП в комментариях становится ясно, что основной целью является проверка перекрывающихся периодов времени.
Например,
- комбинация периодов (
01:00:00
- 02:00:00
, 02:01:00-03:00:00
) - разрешено в тот же день - (
01:00:00
- 05:00:00
, 02:01:00-03:00:00
) или (01:00:00
- 03:00:00
, 02:00:00-04:00:00
) -не разрешены
(Надеюсь, я правильно понял)
Проверка на перекрывающиеся периоды - типичная задача, и я даже нашел существующий ответ по SO: Ограничение проверки на перекрытие диапазона дат
2. Предлагаемое решение
С небольшой модификацией я могу предложить это решение: http://sqlfiddle.com/#!18/e2146/2
CREATE TABLE Schedule (
ID BIGINT IDENTITY PRIMARY KEY,
DDate date,
ST_TIME time,
END_TIME time
);
-- UNIQUE CONSTRAINT
CREATE UNIQUE INDEX UI_DDATE_ST_TIME_END_TIME ON Schedule(DDATE, ST_TIME, END_TIME);
-- CONSTRAINT FOR OVERLAPPING PERIODS
CREATE FUNCTION [dbo].[fn_chkOverlapping]
(
@DDate AS DATE,
@ST_TIME AS TIME,
@END_TIME time
)
RETURNS BIT
AS
BEGIN
RETURN (
SELECT
CASE
WHEN @ST_TIME>@END_TIME THEN 0
WHEN EXISTS(
SELECT 1 FROM [dbo].[Schedule]
WHERE
@DDATE = DDATE
AND @END_TIME >= ST_TIME
AND END_TIME >= @ST_TIME
) THEN 0
ELSE 1
END
)
END;
ALTER TABLE [dbo].[Schedule] WITH CHECK ADD CONSTRAINT [CK_Overlapping] CHECK ([dbo].[fn_chkOverlapping]([DDate],[ST_TIME],[END_TIME])=0);
3. Альтернативы
Совершенно возможно сделать это с помощью триггеров.
Я сам предпочитаю определять ограничения на CREATE CONSTRAINT
, чем на других типах объектов.
Это вопрос вкуса, а ненеобходимость.