我在数据库表中有以下数据,并希望根据开始和结束时间找到并发事务。
Patient Start Time End Time
John 08:31A 10:49A
Jim 10:14A 10:30A
Jerry 10:15A 10:28A
Alice 10:18A 12:29P
Bobby 10:32A 10:49A
Sally 10:46A 10:55A
Jane 10:52A 11:29A
Jules 10:54A 11:40A
Adam 10:58A 11:25A
Ben 11:00A 11:20A
Ann 11:31A 11:56A
Chris 11:49A 11:57A
Nick 12:00P 12:21P
Dave 12:00P 12:35P
Steve 12:23P 12:29P
如果我想找到特定输入的任何重叠时间,我该怎么写呢?例如,我想找到10:58A-11:25A时间的重叠。这需要找到潜在的时间汇率。我正在寻找最大并发重叠次数的计数。在我的10:58A-11:25A示例中,我希望看到以下内容(计数为5):
Patient Start Time End Time
Alice 10:18A 12:29P
Jane 10:52A 11:29A
Jules 10:54A 11:40A
Adam 10:58A 11:25A
Ben 11:00A 11:20A
在我的第二个例子中,一些并发时间与我正在寻找的时间重叠,但它们在另一个范围开始之前结束。所以,说我正在寻找10:46A-10:55A。我希望计数为4.在这个例子中,08:31A-10:49A被丢弃,因为它在10:52A-11:29A开始之前结束了。与10:32A-10:49A相同,它在10:52A-11:29A开始之前结束了。因此,与10:46A-10:55A范围同时最多的是4,即使整体有6(2下降)。
Patient Start Time End Time
Alice 10:18A 12:29P
Sally 10:46A 10:55A
Jane 10:52A 11:29A
Jules 10:54A 11:40A
这可以用sql语句完成吗?
答案 0 :(得分:1)
最简单,最干净的方法是排除行:
除了以下所有行:
样品:
select * from your table t
where
not (
t.end < begin_time
or
t.start > end_time
)