约束以防止时间段重叠

时间:2018-08-02 09:03:07

标签: sql-server sql-server-2008

时间表和时间段在IT世界中没有什么特别的。但是不知何故,我的请求似乎很独特,因为我根本找不到任何有用的东西。

我有两个表,一个表包含静态数据,另一个表包含动态数据,其中第一个表的条目随时间变化。对于第二个表中的每一行,有两列ValidFromValidUntil,而如果没有计划的有效期结束,则后者可以为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版本中不可用)?如果可以,怎么办?

0 个答案:

没有答案