2013-10-07 53 views
2

我再一次試圖解決一個MYSQL相關的問題這聽起來很簡單,在第一,但現在令我有些頭疼。我已經閱讀了大量的代碼片段並進行了幾天的實驗,但是在尋找完美解決方案方面我還沒有取得太大的成功。對多時間匹配表項的日期時間範圍

我有兩個表。第一個包含電話,每個電話由在第一表中的行,它具有以下三列表示:

p_key的值(INT),call_date(DATE),call_time(TIME)

我的第二個表包含特定的事件,也有三列:

事項標識(INT),event_start(DATETIME),event_end(DATETIME)

我想只有我的表計的條目 - 電話t能力 - 這些不在同一日期的事件表中的開始和結束之間的時間內。

我的主要問題是,有可能在事件表中的多個條目爲一個日期(例如:從0800的事件 - 1000和其他一個1400至1600年在同一天)。否則,我可以簡單地使用BETWEEN語法。

我想這可能是一些這種影響:

SELECT 
SUM(
    CASE WHEN t1.p_key != 0 
    THEN 1 ELSE 0 END 
) AS brt, 
SUM(
    CASE WHEN t1.p_key != 0 
    AND t1.call_time NOT BETWEEN TIME(t2.event_start) AND TIME(t2.event_end) 
    THEN 1 ELSE 0 END 
) AS net 


FROM call_table t1 INNER JOIN event_table t2 
ON t1.call_date = DATE(t2.event_start) 
WHERE t1.call_date >= '2013-09-01' 
AND t1.call_date <= '2013-09-30' 
GROUP BY DAY(t1.call_date) 

不幸的是該查詢返回任何結果。

可有人點我到一個粗略的方向?

P.s.我試圖找到如何在這裏,所以我的帖子格式示例表數據參考,但無論是我失明或沒有具體的參考。因爲我已經看到了很好的格式化的示例表的數據,我知道這是可能等等,一個額外的線索,將不勝感激了很多爲好。

UPDATE 我設法得到一些輸出,使用LEFT JOIN而不是INNER。由於我不是MySQL專家,因此如果結果是正確的,我會手動去計數。

+0

又是怎麼回事部分匹配?即當呼叫時間在event_end之前開始,但在它之後結束? (並在下一個event_start之前)?這是匹配還是不匹配? –

+0

嗨,Alma Do Mundo。謝謝你的評論。 call_time沒有開始或結束,它是一個時間點,僅在呼叫開始時才表示。所以我試圖將時間點與時間範圍相匹配,確定這個時間點是在時間範圍內還是時間範圍之外。 – unit303

回答

1

您查詢應該然後

SELECT 
    TIMESTAMP(call_date, call_time) 
FROM 
    calls 
    LEFT JOIN events 
    ON TIMESTAMP(call_date, call_time)>event_start 
    AND timestamp(call_date, call_time)<event_end 
WHERE 
    event_start IS NULL 

- 見這fiddle

對於結果數,只是做

SELECT 
    COUNT(calls.id) 
FROM 
    calls 
    LEFT JOIN events 
    ON TIMESTAMP(call_date, call_time)>event_start 
    AND timestamp(call_date, call_time)<event_end 
WHERE 
    event_start IS NULL 
+0

祕密似乎是將日期+時間值轉換爲時間戳。確實美麗而簡單。令人敬畏的小提琴例子,非常感謝努力伴侶。 – unit303

1

嘗試是這樣的:

SELECT * 
FROM call_table t1 
WHERE NOT EXISTS (
    SELECT * FROM event_table t2 
    WHERE TIMESTAMP(t1.date, t1.time) BETWEEN t2.event_start AND t2.event_end) 
) 

這應該給你call_table所有記錄不與任何事件開始和enddates在event_table之間下降。如果您認爲合適,請添加您自己的where-criteria和/或count()函數。

+0

經過試驗這個查詢後,它看起來很有希望。我們可能會在這裏得到答案。我會在多一點評估後再報告。已經有很高的評價了。 – unit303

+0

很高興聽到它。如果您希望我進一步闡述此方法,請告訴我,或者查看關於MySQL EXISTS的文檔:http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries .html – Dan

+0

@all:我已經將查詢實現到了我的應用程序中,並且它看起來能夠完美地工作。再次感謝所有有關各方,這個問題可以認爲是答案。不確定一個mod是否可以相應標記它。如果可以的話,我會投兩個建議。 – unit303