如何防止SQL中的日期重叠?

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)

我正在尝试编写一个多用户系统,该系统不允许汽车重叠的时间和后期.我需要能够以非连续顺序添加招聘.还需要允许编辑招聘.

有什么方法来约束表或使用触发器等来防止重叠?我正在使用实体框架,所以我想要正常插入到表中,然后如果失败则抛出一些可捕获的异常等.

one*_*hen 3

考虑这个查询:

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)

  • 如果您使用“INSTEAD OF”触发器,那么您必须将代码编写到基表中实际的“INSERT”/“UPDATE”行;使用“AFTER”触发器,您不需要这样做,因为更新的行已经存在。“INSTEAD OF”触发器用于“采取进一步的操作”,它们的主要用途是使原本不可更新的“VIEW”可更新,例如对单个 VIEW 的更新可以写入单个“INSTEAD OF”触发器内的多个表。 (2认同)