2012-10-22 47 views
1

我有一個數據庫表中的以下數據,並希望根據開始和結束時間查找併發事務。找到併發與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語句來完成嗎?

+0

你要4條記錄還是4條記錄? –

回答

1

最容易和清潔的方法是排除行:

所有行不同的是:比結束時間之後開始

  • 行比開始時間之前結束

樣品:

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

Sample in sqlfiddle