Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

CHECK для диапазона времени

$
0
0
Есть таблица с логином оператора, датой начала и датой завершения некоторого процесса. Как сделать ограничение, чтобы при добавлении новой записи у оператора не было пересечения периодов? Написал скалярную функцию, но мне кажется должно быть другое, более простое (и более скоростное) решение.
+
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

Viewing all articles
Browse latest Browse all 7251

Trending Articles