小编典典

SQL Server 2008中的唯一日期范围字段

sql

我有一个表,该表除其他外包括两个名为StartTime和EndTime的字段。两者都是“时间”字段。

我想添加一个约束,以防止插入与预先存在的时间范围重叠的任何记录。例如,如果一条记录已经存在,且StartTime = 5:00,EndTime =10:00,则我希望StartTime = 6:00,EndTime = 9:00的插入由于重叠而失败。

有没有办法,无论有没有触发器,都可以做到这一点?


阅读 210

收藏
2021-03-17

共1个答案

小编典典

低于触发应该努力-
它也可能与检查约束要做到这一点,但在所示的逻辑这个帖子样的伤害了我的头上。

CREATE TRIGGER [dbo].[DateRangeTrigger]
   ON  [dbo].[TargetTable]
   FOR INSERT, UPDATE
AS 
BEGIN

IF EXISTS (SELECT t.starttime, t.endtime FROM TargetTable t
        Join inserted i
        On (i.starttime > t.starttime AND i.starttime < t.endtime AND i.UniqueId <> t.UniqueId) 
           OR (i.endtime < t.endtime AND i.endtime > t.starttime AND i.UniqueId <> t.UniqueId)
           OR (i.starttime < t.starttime AND i.endtime > t.endtime AND i.UniqueId <> t.UniqueId)
        )
BEGIN
    RAISERROR ('Inserted date was within invalid range', 16, 1)
    IF (@@TRANCOUNT>0)
        ROLLBACK
END


END
2021-03-17