2012-05-15 48 views
4

對不起甚至更早搞壞了這個問題...它仍然逃避我。MySQL的 - 在單個表中選擇日期範圍重疊

基本上,我有跟蹤一組「批准」用於報告的一個單一的表。還會跟蹤報告何時「創建」以及何時「提交」。

我期待標誌時有日期/時間的任何報告重疊。

例(一個表中, 「報告」):

"Created"                 "Submitted"                "ApproverID" 
4/20/2012 5:01:32 AM          4/20/2012 5:30:32 AM          10 
4/20/2012 5:08:32 AM          4/20/2012 5:45:32 AM          10 
4/20/2012 5:01:32 AM          4/19/2012 5:38:16 PM          15 

...我需要的是返回以下(其中同一審批重疊日期/時間)

 "Created"                 "Submitted"                "ApproverID"     
4/20/2012 5:01:32 AM          4/20/2012 5:30:32 AM          10             
4/20/2012 5:08:32 AM          4/20/2012 5:45:32 AM          10 

所以批准者(在本例中爲10)有一個覆蓋這些報告的窗口。看起來像一個帶BETWEEN子句的SELECT ...但我有點難住。

我有一些簡單的像下面:

SELECT Created, LastModified, ApprovalGroupID, count(*) 
FROM shifthandover.uniquereports 
WHERE ApprovalGroupID between Created and LastModified 

幫助感激!

+1

如果我理解正確的話,它比SELECT BETWEEN ... – jadkik94

回答

3

從你的問題,據我瞭解,在創建第一(或更早)的報告後,將創建第二個(或後續)報告的「重疊」的發生,但在此之前報告提交之前 - 也就是審批是工作一次多個報告。那是對的嗎?

你可以嘗試加入報告表到自身 - 如:

SELECT * FROM reports r1 
JOIN reports r2 
ON r1.approvalId=r2.approvalId 
AND r2.created>r1.created 
AND r2.created<r1.submitted 
+0

賓果肯定更復雜,這是完美的。謝謝!!! – mototrionic

1
SELECT Created, LastModified, ApprovalGroupID, count(*) --whatever those are 
FROM  uniquereports AS r1 
JOIN  uniquereports AS r2.ApproverID = r1.ApproverID AND r2 ON r2.id = r1.id -- the unique id of the table, or use whatever combination to get a unique representation, which is important. 
WHERE r2.Created >= r1.Created AND r2.Created <= r1.LastModified OR 
     r2.LastModified >= r1.Created AND r2.LastModified <= r1.LastModified OR 
     r2.Created <= r1.Created AND r2.LastModified >= r1.LastModified OR 
     r2.Created >= r1.Created AND r2.LastModified <= r1.LastModified    
GROUP BY r1.ApproverID 

,因爲我們已經考慮的r2.Created大於r1.Created在第一OR的情況下最後OR條款是不是在這裏有用條款,從技術上考慮,記錄在其創建之前不能修改。仍然在那裏添加,以確保所有情況。

1

這提供了approver_id和重疊該批准的數目。

select approver_id, count(*)/2 from (
    select t1.approver_id 
    from reports t1 
    join reports t2 on 
    t2.approver_id = t1.approver_id 
    AND t1.id <> t2.id 
    where 
    NOT((t1.submitted < t2.created) 
    OR (t1.created > t2.submitted)) 
) t2 group by approver_id; 

計數(*)/ 2是有這樣就不會重複計算,其中A重疊B和B還重疊A.置換,我假定有一個RECORD_ID或其他主鍵,以防止從自我計數記錄。