0

我有这样的示例表:

+--------------+--------------+-------+
| Start date   | End date     | State |
+--------------+--------------+-------+
|20131205 10:00|20131205 11:00| A     |
|20131205 11:00|20131205 12:00| B     |
|20131205 12:00|20131205 13:00| C     |
+--------------+--------------+-------+

我想以如下所示的方式插入新状态 (D):

+--------------+--------------+--------+
| Start date   | End date     | State  |
+--------------+--------------+--------+
|20131205 10:00|20131205 11:00| A      |
|20131205 11:00|20131205 11:20| B      |
|20131205 11:20|20131205 11:40| D (NEW)|
|20131205 11:40|20131205 12:00| B      |
|20131205 12:00|20131205 13:00| C      |
+--------------+--------------+--------+

这意味着如果我在与新状态 (D) 相同的时间有其他状态 (B),那么旧状态 (B) 应该及时切片。

我怎样才能做到这一点?

(我使用的是 MS SQL Server 2008)

4

2 回答 2

1

一种可能的解决方案是使用触发器- 触发器是一种特殊类型的存储过程,当数据库服务器中发生事件时会自动执行。

在您的情况下,您可以使用instead of insert事件 - 每次需要在表中插入新记录以及overwrites标准插入操作本身时,都会执行该过程。

触发器会做什么?

下面的屏幕截图显示了可能的场景:

在此处输入图像描述

其中A, B, C, DE是表中已经插入的行,X, YZ是要插入的新行 - 都显示在同一时间轴中。

处理情况

  1. X案例 -开始结束日期不与任何现有的开始结束日期记录重叠。这是最简单的情况,因为您只需要插入新记录。
  2. Y案例 -开始日期和结束日期都在现有期间。你应该:

    • 插入新的Y记录
    • 插入带有E星日期和Y星日期的新E记录
    • 将现有的E记录开始日期更新为Y结束日期
  3. Z案例 - 插入的记录开始结束日期与多个现有期间重叠:

    • 插入新记录
    • 检查新记录开始日期属于哪个时期,并将其结束日期更新为新记录开始日期
    • 检查新记录结束日期在哪个时期,并将其开始日期更新为新记录结束日期
    • 删除所有开始结束日期在新记录期间的期间

这对您来说不应该是复杂的——只有一些IF带有日期比较的语句。

一些建议 - 您可以在单独的 SQL 过程中自由添加上述逻辑,并且当您需要插入新记录来调用它时。这更好,因为我们跳过了这trigers部分。

最后,当您从表中提取记录时,您需要按Start date列对其进行排序 - 它的格式很好,并且可以按照您喜欢的顺序获取记录。

于 2013-11-12T19:29:32.783 回答
0

@gotqn 如果 D 记录的“结束日期”是 20131205 13:00 结果表应该如下所示:

+---------------+--------------+--------+
| 开始日期 | 结束日期 | 状态 |
+---------------+--------------+--------+
|20131205 10:00|20131205 11:00| 一个 |
|20131205 11:00|20131205 11:20| 乙|
|20131205 11:20|20131205 13:00| D(新)|
+---------------+--------------+--------+

@valex“如果插入记录的时间范围与 B 和 D 相交,例如 11:20-12:30”在这种情况下,结果应该是:

+---------------+--------------+--------+
| 开始日期 | 结束日期 | 状态 |
+---------------+--------------+--------+
|20131205 10:00|20131205 11:00| 一个 |
|20131205 11:00|20131205 11:20| 乙|
|20131205 11:20|20131205 12:30| E(新)|
|20131205 12:30|20131205 13:00| C |
+---------------+--------------+--------+
于 2013-11-12T13:42:29.937 回答