我有这样的示例表:
+--------------+--------------+-------+
| 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)
答案 0 :(得分:1)
其中一种可能的解决方案是使用trigger - 触发器是一种特殊的存储过程,可在数据库服务器中发生事件时自动执行。
在您的情况下,您可以使用instead of insert
事件 - 每次需要在表中插入新记录并overwrites
标准插入操作本身时,将执行该过程。
触发器会做什么?
下面的屏幕截图显示了可能的情况:
其中A, B, C, D
和E
是已经在您的表格中已经过不足的行,X, Y
和Z
是要输入的新行 - 所有行都显示在同一时间轴中。
处理情况
Y 案例 - 开始和结束日期都在现有期间。你应该:
Z 案例 - 插入的记录开始和结束日期与几个现有时段重叠:
这不应该归你所有 - 只有一些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 | +--------------+--------------+--------+