我正在创建一个存储过程,该过程根据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天内的时段,但可能存在时段跨越多天的实例。
答案 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