Transact-SQL:检测多行的日期边界

时间:2010-02-01 23:41:40

标签: sql algorithm tsql datetime

我正在创建一个存储过程,该过程根据SQL数据库中的数据生成报告,并将这些报告存储在单独的数据库中。报告的数据是电机运行的日期范围内的总时间。我希望能够检测我报告的时间范围是否与基于日期时间的先前报告重叠。

例如,我们有下表:

Row-----Value-----StartDate------------------EndDate
1-------12--------2010-01-21 00:00:00.000----2010-01-21 11:59:99.997   
2-------12--------2010-01-22 00:00:00.000----2010-01-22 11:59:99.997
3-------12--------2010-01-22 12:00:00.000----2010-01-22 23:59:99.997
4-------12--------2010-01-23 00:00:00.000----2010-01-23 11:59:99.997
5-------12--------2010-01-24 00:00:00.000----2010-01-24 11:59:99.997

如果我要在此表中插入以下行:

INPUT:

 1. Value = 12, StartDate = 2010-01-21 6:00:00.000, EndDate = 2010-01-21 17:59:99.997
 2. Value = 14, StartDate = 2010-01-21 11:00:00.000, EndDate = 2010-01-22 0:59:99.997
 3. Value = 13, StartDate = 2010-01-20 12:00:00.000, EndDate = 2010-01-21 0:59:99.997

输出:

 1. Value = 6, StartDate = 2010-01-21 12:00:00.000, EndDate = 2010-01-21 17:59:99.997
 2. Value = 12, StartDate = 2010-01-21 12:00:00.000, EndDate = 2010-01-21 23:59:99.997
 3. Value = 12, StartDate = 2010-01-20 12:00:00.000, EndDate = 2010-01-20 23:59:99.997

如您所见,调整开始/结束日期并删除额外时间。重要的是要注意结果是如果只添加了1行,而不是同时添加所有3行。

我想我已经把问题看得太久了,而且看不到森林里的树木了。然而,在写这个问题的过程中,我想出了一些更多的想法,以及对我的表进行修改,但仍然希望看到你们如何处理这种情况。

问题:您会使用什么查询来检测跨越多行的其他日期范围内的开始和结束日期?

干杯!

*编辑*

为了澄清我的示例数据,输出1的值= 6来自它与第1行冲突6小时的事实。以下是每个输入的更改。

  1. 与第1行输入冲突,将输入的开始时间移至行的EndDate + 3 ms和查询(时间跨度= 6小时)。
  2. 与第1行和第1行的输入冲突2,将开始时间移至行1 + 3 ms的EndDate,将结束时间移至行2 - 3 ms的StartDate。 (Timespan = 12小时)
  3. 与第1行输入冲突,将结束时间移至第1行的EndDate - 3 ms。 (Timepsan = 12小时)。
  4. 虽然此示例仅显示1天内的时段,但可能存在时段跨越多天的实例。

1 个答案:

答案 0 :(得分:2)

要查找重叠,请考虑在重叠行中,两个StartDate必须在EndDate之前发生。

所以你应该能够做到这样的事情:

select *
from yourTable t1
  join
  yourTable t2
   on  t2.StartDate < t1.EndDate
   and t1.StartDate < t2.EndDate

您可能需要确保没有StartDate&gt;行? EndDate,使用检查约束。否则,请包括:

   and t1.StartDate < t1.EndDate
   and t2.StartDate < t2.EndDate