sql - 事务处理 SQL : Detect Date boundaries across multiple rows

标签 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

如果我要将以下行插入到该表中:

输入:

 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. 输入与第 1 行冲突,将输入的开始时间移动到行的结束日期 + 3 毫秒并查询(时间跨度 = 6 小时)。
  2. 输入与第 1 行和第 2 行冲突,将开始时间移至第 1 行的结束日期 + 3 毫秒,将结束时间移至第 2 行的开始日期 - 3 毫秒。 (时间跨度 = 12 小时)
  3. 输入与第 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/

相关文章:

MySQL加入更新: Updating join table row twice

SQL选择多个列中存在的多个值

algorithm - python中关键路径的变化

arrays - 数组所有可能的组合

java - 如何从连续运行的随机整数生成器中(有效地)找到整数簇的数量?

sql-server - 这是一个高效的 sql server 查询吗?

TSQL 消息 1013 "Use correlation names to distinguish them."

sql - 使用 Delphi XE3 如何获取 MS Access 中的表列表并排除 View /查询?

sql - 交易重复错误

sql-server - T-SQL 如何选择最近的日期