2012-09-16 90 views
4

我有一個包含事件的數據庫。每個事件都有一個時間戳。事件在一天中均勻分佈,但每天晚上都有一個沒有數據的時間跨度。我的問題是,這個夜晚沒有很好的定義。它可以是第二天23點到早上7點,也可以是當天凌晨2點到上午10點,也可以是當天晚上8點到23點。查找數據庫中沒有數據的最大Timespan

現在我想計算事件的間隔,但沒有沒有事件的大時間間隔。但我不知道如何找到這個時間跨度。我的問題是,可能有幾天沒有時間跨度,或兩天有相同的時間跨度(例如第一天的晚上8點到午夜,第二天的午夜到上午7點)。

我現在的問題是:如何找到這個時間跨度?

我更喜歡MySql中的解決方案,但如果它不可能,也可以使用PHP。

+0

如何找到一天中沒有事件的最大時間跨度,然後將所有「空洞」(事件間的時間)與它比較 - 只要它們不大或相等,那麼它就是同一天。如果更大 - 新的一天開始了......? – Havelock

+0

問題在於:一天可能會出現相關漏洞,一天一早,一天晚上,並且必須與前一天/第二天一起添加。我什至不知道如何獲得洞;-) – Tokk

+1

只是一個粗略的想法,只需選擇n和n-1的時間戳,並獲得時間戳的差異。然後按這個差別排序。應該讓你獲得想要的結果。 – Najzero

回答

2

如何將表自連接到下一行,然後在連接的表之間做一個時間差異,並找到最大差異?

假設你的模式是這樣的(並假設條目按時間順序):

CREATE TABLE log (
    id INT NOT NULL AUTO_INCREMENT, 
    occurred_at DATETIME, 
    event VARCHAR(255), 
    PRIMARY KEY (id), 
    INDEX (occurred_at) 
); 

事情是這樣的:

SELECT 
    TIMEDIFF(after.occurred_at, before.occurred_at) AS time_gap, 
    `before`.*, 
    `after`.* 
FROM 
    log `before` JOIN 
    log `after` ON after.id = before.id+1 
ORDER BY time_gap DESC LIMIT 1; 
+0

+1因爲基本上我的評論和路要走。 – Najzero

+0

我會試試這個 – Tokk

0

你爲什麼不只是處理排序事件列表,並尋找每天內最大的差距?

查找排序列表中的空白是微不足道的。定義一些閾值,例如「最少1小時」和「與12-6間隔重疊」,然後您就可以完成間隙檢測。

這不是真正的「數據挖掘」,順便說一句。 - 這只是一個非常簡單的數據查詢。