Gra*_*ler 5 sql t-sql sql-server-2008-r2
我有一个雇用表的下表结构:
hireId int primary key
carId int not null foreign key
onHireDate datetime not null
offHireDate datetime not null
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个多用户系统,该系统不允许汽车重叠的时间和后期.我需要能够以非连续顺序添加招聘.还需要允许编辑招聘.
有什么方法来约束表或使用触发器等来防止重叠?我正在使用实体框架,所以我想要正常插入到表中,然后如果失败则抛出一些可捕获的异常等.
考虑这个查询:
SELECT *
FROM Hire AS H1, Hire AS H2
WHERE H1.carId = H2.carId
AND H1.hireId < H2.hireId
AND
CASE
WHEN H1.onHireDate > H2.onHireDate THEN H1.onHireDate
ELSE H2.onHireDate END
<
CASE
WHEN H1.offHireDate > H2.offHireDate THEN H2.offHireDate
ELSE H1.offHireDate END
Run Code Online (Sandbox Code Playgroud)
如果所有行都满足您的业务规则,则此查询将是空集(假设期间的闭开表示,即结束日期是期间内未考虑的最早时间粒度)。
由于SQL Server 不支持CHECK约束内的子查询,因此请将相同的逻辑放入触发器中(但不是INSTEAD OF触发器,除非您可以提供解决重叠的逻辑)。
使用Fowler 的替代查询:
SELECT *
FROM Hire AS H1, Hire AS H2
WHERE H1.carId = H2.carId
AND H1.hireId < H2.hireId
AND H1.onHireDate < H2.offHireDate
AND H2.onHireDate < H1.offHireDate;
Run Code Online (Sandbox Code Playgroud)