我正在建立数据库来管理会议,我正在尝试添加约束,以防止两个日期范围重叠。我检查的功能如下:
create function DateOverlapping
(
@ConferenceID int,
@BeginDate date,
@EndDate date
)
returns bit
as begin
declare @valid bit = 1;
if exists (select *
from PaymentsThreshold
where ConferenceID = @ConferenceID
and @BeginDate < ToDate and @EndDate > FromDate)
begin
set @valid = 0;
end
return @valid;
end
然而,即使我正在尝试将记录添加到空表中,这些函数也始终返回0。 任何人都可以帮我解决这个问题吗?
@hatchet我将check constrait添加到PaymentsThreshold表:
alter table dbo.PaymentsThreshold with nocheck add constraint CK_pt_dates_chronology
check (dbo.DateOverlapping(ConferenceID, FromDate, ToDate) = 1);
然后我试图插入一些数据(到安培表):
insert into PaymentsThreshold values(1, '2017-03-11', '2017-05-11', 0.2)
并导致错误
答案 0 :(得分:0)
关于为什么总是得到0.在>>添加行之后完成约束检查。您只检查刚刚添加的行的重叠,这样可以保证总是得到0,因为行总是重叠。您需要从支票中排除新添加的行。你想要ConferenceId <> @ConferenceId
。这样,您可以检查与的任何行重叠,但是您刚刚添加的行。
if exists (select *
from PaymentsThreshold
where ConferenceID <> @ConferenceID
and @BeginDate < ToDate and @EndDate > FromDate)
begin
set @valid = 0;
end