mySQL - SELECT表中的日期范围重叠

时间:2012-05-15 22:06:10

标签: 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

帮助感谢!

3 个答案:

答案 0 :(得分:3)

根据您的问题,我了解在创建第一个(或更早的)报告之后但在提交之前的报告之前创建第二个(或后续)报告时会发生“重叠” - 即批准者正在处理一次多个报告。这是对的吗?

您可以尝试将报告表加入到自身中 - 例如:

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

答案 1 :(得分: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

最后OR子句在这里没有用,因为我们已经考虑过r2.Createdr1.Created条款中大于OR的情况,从技术上考虑记录可以在创建之前不要修改。仍然添加以确保所有情况。

答案 2 :(得分: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或其他主键来防止记录自己计数