【发布时间】:2009-04-23 14:08:21
【问题描述】:
我在一个更大的问题上遇到了障碍。
作为大型查询的一部分,我需要解决“守夜人”问题。 我有一张这样的日程表:
ID | Start | End
1 | 2009-1-1 06:00 | 2009-1-1 14:00
2 | 2009-1-1 10:00 | 2009-1-1 18:00
3 | 2009-2-1 20:00 | 2009-2-2 04:00
4 | 2009-2-2 06:00 | 2009-2-2 14:00
作为查询的一部分,我需要确定在给定时间范围内,房间内是否始终至少有 1 名守望者。
因此,如果我指定范围 2009-1-1 06:00 到 2009-1-1 12:00,结果为真,因为班次 1 和班次 2 合并以涵盖此时间段 - 事实上,任何数量的班次都可以链接起来以保持监视。但是,如果我检查 2009-2-1 22:00 到 2009-1-2 10:00,结果是错误的,因为第二天早上 4 点到 6 点之间有休息。
我想在 LINQ 中实现这个或者,或者作为 SQL Server (2005) 中的用户定义函数,因为在这两种情况下,这只是更大查询逻辑的一部分必须运行以识别需要注意的元素。真实的数据集包含大约一百个与任何给定时间段相交的班次记录,但并不总是涵盖整个范围。
我找到的最接近的是 How to group ranged values using SQL Server 对于数字范围,但它取决于在下一个范围开始之前结束的每个范围。如果我可以构建相同的手表统一视图,只考虑重叠的手表,那么检查是否覆盖了特定时间将是微不足道的。统一视图如下所示:
Start | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00
注意:只需提取所有数据并在其上运行一些手动循环,整个事情就相对容易实现,但这是当前系统,由于班次和时间的数量,它相当慢必须检查的范围。
【问题讨论】:
-
不应该将“所以如果我指定范围 2009-1-1 12:00 到 2009-1-1 06:00”中的日期范围反转为“2009-1-1 06: 00 到 2009 年 1 月 1 日 12:00”?
-
@David 您可能想要下载这本电子书:“在 SQL 中开发面向时间的数据库应用程序”(cs.arizona.edu/people/rts/tdbbook.pdf)。它有很多关于对具有日期范围的表进行复杂 SQL 查询的有用信息。
-
+1 - 我正在解决类似的问题,识别不相交和重叠
标签: sql sql-server-2005 algorithm linq-to-sql tsql