SQL Server 唯一键约束日期/时间跨度

kyl*_*tme 2 sql-server sql-server-2014

如何为下表设置唯一键约束,以确保日期/开始时间和日期/结束时间之间的日期/时间跨度不与其他记录重叠?如果我需要添加计算列,什么数据类型和计算?

Column Name   Data Type
Date          date
BeginTime     time(7)
EndTime       time(7)
Run Code Online (Sandbox Code Playgroud)

谢谢。

Vla*_*nov 5

亚历山大·库兹涅佐夫展示了一种可能的方法。存储没有重叠的时间间隔

另请参阅 Joe Celko 的文章:连续时间段

这是表格和第一个区间:

CREATE TABLE dbo.IntegerSettings(SettingID INT NOT NULL,
  IntValue INT NOT NULL,
  StartedAt DATETIME NOT NULL,
  FinishedAt DATETIME NOT NULL,
  PreviousFinishedAt DATETIME NULL,

  CONSTRAINT PK_IntegerSettings_SettingID_FinishedAt 
      PRIMARY KEY(SettingID, FinishedAt),

  CONSTRAINT UNQ_IntegerSettings_SettingID_PreviousFinishedAt
      UNIQUE(SettingID, PreviousFinishedAt),

  CONSTRAINT FK_IntegerSettings_SettingID_PreviousFinishedAt
    FOREIGN KEY(SettingID, PreviousFinishedAt)
    REFERENCES dbo.IntegerSettings(SettingID, FinishedAt),

  CONSTRAINT CHK_IntegerSettings_PreviousFinishedAt_NotAfter_StartedAt
      CHECK(PreviousFinishedAt <= StartedAt),

  CONSTRAINT CHK_IntegerSettings_StartedAt_Before_FinishedAt 
      CHECK(StartedAt < FinishedAt)
);

INSERT INTO dbo.IntegerSettings
    (SettingID, IntValue, StartedAt, FinishedAt, PreviousFinishedAt)
VALUES(1, 1, '20070101', '20070103', NULL);
Run Code Online (Sandbox Code Playgroud)

约束强制执行这些规则:

  • 一个设置只能有一个第一个间隔
  • 下一个窗口必须在上一个窗口结束后开始
  • 两个不同的窗口不能引用与前一个窗口相同的窗口

  • 对于后面的人,在我们的讨论中我们得出的结论是,这只适用于 MS-SQL,因为它在索引中没有 NULL 的标准 SQL 实现。如果您可以插入多个带有 NULL previous_end_date 的记录(如在 Oracle、PG 和其他标准 SQL 中),那么一切皆有可能。 (2认同)