如何找到开始和放大的行列表结束几乎匹配一次?

时间:2013-07-02 15:46:12

标签: mysql sql time

我有一张包含一些时间存在的表格,如下所示:

presences (id, account_id, start, end, date);

这里有一些条目:

1, 1, 10:00:00, 11:00:00, 2013-07-02
2, 2, 10:05:00, 11:05:00, 2013-07-02
3, 3, 9:55:00, 11:10:00, 2013-07-02
4, 4, 10:02:00, 10:58:00, 2013-07-02
5, 1, 14:00:00, 15:30:00, 2013-07-02
6, 2, 14:03:00, 15:36:00, 2013-07-02
7, 3, 13:56:00, 15:28:00, 2013-07-02
8, 4, 14:05:00, 15:30:00, 2013-07-02

正如您所看到的,帐户的startend时间大约 10-11 / 14-15h,但并不总是同样,所以我不能搜索WHERE start = 14:00:00 AND end = 15:30:00例如。

对于查询,我有一行的日期和值(id:1),我喜欢MySQL以返回所有相同日期的存在,是 not {id} 并让在相同的时间范围内开始和结束

到目前为止,我有这个实现,但我正在寻找一种更好的方法(如果它存在)来匹配结果:

我得到start + (end - start / 2)的中间时间(对于id:1,这意味着10:30:00),我这样搜索:

SELECT * 
FROM presences 
WHERE id != 1 
  AND start < 10:30:00 AND end > 10:30:00 
  AND date = 2013-07-02

iddate是从查询中找到的值(SELECT * FROM presences WHERE id = 1),startend的计算方法如前所述。

有没有更好的方法来找到相似的时间?

1 个答案:

答案 0 :(得分:0)

您可以在一个查询中执行此操作:

SELECT * 
FROM presences p cross join
     (select p.* from presences p where id = 1
     ) p1
where p.id <> p1.id and
      p.date = p1.date and
      p.start < p1.start + (p1.end - p1.start / 2) and
      p.end >  p1.start + (p1.end - p1.start / 2) 

如果您想要任何重叠,请使用以下逻辑:

SELECT * 
FROM presences p cross join
     (select p.* from presences p where id = 1
     ) p1
where p.id <> p1.id and
      p.date = p1.date and
      (p.start < p1.end and
       p.end > p1.start
      )

如果你想在范围内开始和结束,那么明确地寻找:

SELECT * 
FROM presences p cross join
     (select p.* from presences p where id = 1
     ) p1
where p.id <> p1.id and
      p.date = p1.date and
      p.start between p1.start + p1.end and
      p.end between p1.start + p1.end

您可以从p1.startp1.end添加/减去几分钟,以使匹配更加模糊。