用oracle select找到时间并发

时间:2012-10-22 16:28:41

标签: sql oracle

我在数据库表中有以下数据,并希望根据开始和结束时间找到并发事务。

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语句完成吗?

1 个答案:

答案 0 :(得分:1)

最简单,最干净的方法是排除行:

除了以下所有行:

  • 行比开始时间之前的结束
  • 行比结束时间后开始

样品:

select * from your table t
where
   not ( 
     t.end < begin_time 
     or
     t.start > end_time 
   )

Sample in sqlfiddle