2012-05-15 52 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或其他主键,以防止从自我计数记录。