使用时间切片插入数据

时间:2013-11-12 12:55:07

标签: sql sql-server sql-server-2008 tsql sql-insert

我有这样的示例表:

+--------------+--------------+-------+
| 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)

2 个答案:

答案 0 :(得分:1)

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

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

触发器会做什么?

下面的屏幕截图显示了可能的情况:

enter image description here

其中A, B, C, DE是已经在您的表格中已经过不足的行,X, YZ是要输入的新行 - 所有行都显示在同一时间轴中。

处理情况

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

    • 插入新的 Y 记录
    • 使用 E 星号日期和 Y 星号日期
    • 插入新的 E 记录
    • 将退出的 E 记录开始日期更新为 Y 结束日期
  3. Z 案例 - 插入的记录开始结束日期与几个现有时段重叠:

    • 插入新记录
    • 检查新记录开始日期属于哪个期间,并将结束日期更新为新记录开始日期
    • 检查新记录结束日期在哪个时段流行,并将开始日期更新为新记录结束日期
    • 删除开始结束日期属于新的recod期间的所有期间
  4. 这不应该归你所有 - 只有一些IF语句与日期比较。

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

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

答案 1 :(得分:0)

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

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

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

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