2011-10-24 18 views
0

假設我已經表叫events與列如何在MySQL中查找與一組小時重疊的事件範圍?

INT id 
DATETIME start_time 
DATETIME end_time 

我如何才能找到的所有行從START_TIME時間範圍的任何部分在一定時間範圍內END_TIME跌倒?

例如,我可能希望在8-10點小時範圍內查找事件中某些部分的行。

喜歡的東西

select * from events where (hour(start_time) IN (20, 21, 22)) or (hour(end_time) IN (20, 21, 22)) 

會的工作,除了爲晚上八時前開始,晚上11時後結束事件。

最後,它必須跨越一天的界限,所以像23-2(晚上11點 - 凌晨2點)的範圍也應該工作。

不幸的是我無法修改表的模式。

+0

我不明白:你說之前_where事件的8期間讓他們的某些部分-10pm小時範圍_然後你說_a範圍就像23-2(晚上11點 - 凌晨2點)也應該工作_...所以,什麼是正確的? – Marco

+0

我需要支持任意小時範圍。所以1-6,3-10,23-2,10-4,無論如何。 –

回答

1

我設法使這項工作符合日界限要求。這很醜陋,但它似乎涵蓋了所有的情況。

雖然可以編寫一個存儲過程來做到這一點,它更容易在Java中表達,所以:

public void checkEvents (int[][] events, int startHour, int endHour)  

    final int START   = 0; 
    final int END   = 1; 
    final int HOURS_PER_DAY = 24; 

    for (int[] event : events) { 

    int start = startHour; 
    int end = (endHour < startHour) ? endHour + HOURS_PER_DAY : endHour; 

    int eventStart = event[START]; 
    int eventEnd = (event[END] < event[START]) ? event[END] + HOURS_PER_DAY : event[END]; 

    if (checkOverlap(result, event, start, end, eventStart, eventEnd)) 
    || (checkOverlap(result, event, start, end, eventStart + HOURS_PER_DAY, eventEnd + HOURS_PER_DAY)) 
     || (checkOverlap(result, event, start + HOURS_PER_DAY, end + HOURS_PER_DAY, eventStart, eventEnd)) 
     || (!checkOverlap(result, event, start + HOURS_PER_DAY, end + HOURS_PER_DAY, eventStart + HOURS_PER_DAY, eventEnd + HOURS_PER_DAY); 
      System.out.println("overlapped!"); 
    } 
} 

private boolean checkOverlap(ArrayList<int[]> result, int[] event, int start, int end, int eventStart, int eventEnd) { 

    if ((eventStart >= start && eventStart < end) || (eventStart < start && eventEnd > start)) { 
    return true; 
    } 

    return false; 
} 
2

假設START_TIME和END_TIME字段是日期時間字段,然後

SELECT * 
FROM events 
WHERE (start_time <= $event_end_time) AND (end_time >= $event_start_time) 

這有點違反直覺的,但如果你看它在時間軸上:

一個& B是你的極限fenceposts。 X & Y是START_TIME和END_TIME字段:

  A B 
p = ----------- event falls outside the boundaries 
    X Y 

     A B 
q = ----------- partial overlap 
    X Y 

     A B 
r = ----------- partial overlap again 
     X Y 

     A B 
s = ----------- full overlap 
    X  Y 

     A B 
t = ----------- outside boundaries 
      X Y 

你感興趣的情況下,Q,R和S你會注意到,對於那些3例,則Y始終> = A,X是總是< = B

+0

+1爲插圖。它缺少A <= X <= B <= Y的情況,但不變量仍然成立。 –

+0

不幸的是,我不是在明確的開始和結束時間之間尋找事件,我正在尋找一天中特定時段的事件。 –

+0

同樣的邏輯適用。只需做適當的轉換即可查看僅時間段。如果您正在查看多個句點,則多次運行查詢,構建包含所有句點的聯合查詢,或者爲每個句點構建一個長的「if/else/else/else」序列。 –