Есть таблица с логином оператора, датой начала и датой завершения некоторого процесса. Как сделать ограничение, чтобы при добавлении новой записи у оператора не было пересечения периодов? Написал скалярную функцию, но мне кажется должно быть другое, более простое (и более скоростное) решение.
+ |
CREATE TABLE [dbo].[OperList](
[id] [int] IDENTITY(1,1) NOT NULL,
[Operator] [varchar](10) NOT NULL,
[StartDate] [smalldatetime] NOT NULL,
[EndDate] [smalldatetime] NOT NULL,
[Stamp] [datetime] NOT NULL CONSTRAINT [DF_OperList_Stamp] DEFAULT (getdate()),
)
ALTER TABLE [dbo].[OperList] WITH CHECK ADD CONSTRAINT [CK_OperList_Date] CHECK (([Startdate]<[EndDate]))
ALTER TABLE [dbo].[OperList] WITH CHECK ADD CONSTRAINT [CK_OperList_Period] CHECK (([dbo].[fnCheckOperPeriod]()=(0)))
ALTER FUNCTION [dbo].[fnCheckOperPeriod]
(
-- Add the parameters for the function here
)
RETURNS int
AS
BEGIN
DECLARE @res int = 0
set @res = (
SELECT count(*) as Total
FROM [dbo].[OperList] O1
inner join [dbo].[OperList] O2
on O1.id <> O2.id
and O1.Operator = O2.Operator
and (
(O2.StartDate > O1.Startdate and O2.StartDate < O1.EndDate)
or
(O2.EndDate > O1.Startdate and O2.EndDate < O1.EndDate)
or
(O2.StartDate > O1.StartDate and O2.EndDate < O1.EndDate)
or
(O2.StartDate < O1.StartDate and O2.EndDate > O1.EndDate)
)
)
RETURN @res
END
|