如何查找开始和结束几乎匹配时间的行的列表?

如何查找开始和结束几乎匹配时间的行的列表?

问题描述:

我有一个包含一些时间派驻一个表,像这样:如何查找开始和结束几乎匹配时间的行的列表?

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返回我的一切,有同日的派驻,是不{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发现如前解释的计算出的值。

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

感谢您的帮助!

您可以在一个查询做到这一点:

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.start和0123减去几分钟使比赛模糊。

+0

如果以id = 3为例,您的第二个选项可能不起作用 –