时间表和时间段在IT世界中没有什么特别的。但是不知何故,我的请求似乎很独特,因为我根本找不到任何有用的东西。
我有两个表,一个表包含静态数据,另一个表包含动态数据,其中第一个表的条目随时间变化。对于第二个表中的每一行,有两列ValidFrom
和ValidUntil
,而如果没有计划的有效期结束,则后者可以为null
。
简化后,该架构如下所示:
tbStatic
+----+------------+------------+
| Id | Attribute1 | Attribute2 |
+----+------------+------------+
| 1 | foo | bar |
| 2 | baz | foo |
+----+------------+------------+
tbDynamic
+----+------------+---------------------+---------------------+------------+------------+
| Id | tbStaticId | ValidFrom | ValidUntil | Attribute1 | Attribute2 |
+----+------------+---------------------+---------------------+------------+------------+
| 1 | 1 | 2018-01-01 00:00:00 | 2018-01-31 23:59:59 | 1 | 0 |
| 2 | 2 | 2018-04-01 00:00:00 | 2018-04-02 11:59.59 | 2 | 1 |
| 3 | 1 | 2018-02-01 00:00:00 | null | 2 | 1 |
| 4 | 2 | 2018-05-01 00:00:00 | 2018-06-01 00:00:00 | 23 | 15 |
| 5 | 2 | 2018-07-01 01:23:45 | 2018-07-05 23:12:01 | 80 | 12 |
+----+------------+---------------------+---------------------+------------+------------+
您可能已经发现,在每个时间段之间都有漏洞。但是,我们不能有重叠的时期。这意味着同一tbStaticId
不可能有重叠的时间段。
不幸的是,这只是到目前为止的一项要求,尽管它是在使用数据库的应用程序中强制执行的,但我希望在表上设置一个约束,以防止在插入新行或现有行违反此行时进行更新时间唯一性。
如上所述,到目前为止我的研究非常令人失望,这也是为什么我无法真正显示我尝试过的任何代码的原因。我遵循的最有前途的方法是创建一个函数,该函数将一条记录或两个时间段值和外键作为输入,并确定它们是否与其他东西重叠。然后可以在check constraint
中调用此函数。但是在考虑了要检查的案件数量之后,我放弃了,因为这似乎是不合理的(尤其是在考虑更新时,还需要额外注意)。
所以我的问题是,是否有一些简单的方法可以在不使用时态表的情况下限制SQL Server中的时间片(在我的SQL Server版本中不可用)?如果可以,怎么办?