我正在创建一个存储过程,它根据 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
如果我要将以下行插入到该表中:
输入:
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 的 Value=6 是因为它与第 1 行冲突 6 小时。以下是每个输入的更改。
- 输入与第 1 行冲突,将输入的开始时间移动到行的结束日期 + 3 毫秒并查询(时间跨度 = 6 小时)。
- 输入与第 1 行和第 2 行冲突,将开始时间移至第 1 行的结束日期 + 3 毫秒,将结束时间移至第 2 行的开始日期 - 3 毫秒。 (时间跨度 = 12 小时)
- 输入与第 1 行冲突,将结束时间移至第 1 行的 EndDate - 3 毫秒。 (Timepsan = 12 小时)。
虽然此示例仅显示 1 天内的经期,但也可能存在经期跨越多天的实例。
最佳答案
要查找重叠,请考虑在重叠行中,两个 StartDates 必须出现在 EndDate 之前。
所以你应该能够做这样的事情:
select *
from yourTable t1
join
yourTable t2
on t2.StartDate < t1.EndDate
and t1.StartDate < t2.EndDate
您可能希望使用检查约束来确保没有 StartDate > EndDate 的行。否则,包括:
and t1.StartDate < t1.EndDate
and t2.StartDate < t2.EndDate
关于sql - 事务处理 SQL : Detect Date boundaries across multiple rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180899/