mysql SQL通过开始和结束日期查找连续时间

vaqhlq81  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(144)

假设我有一个数据库表employee_worksheet,数据如下:
| ID|员工ID|时间开始|时间结束|
| --|--|--|--|
| 第一名| 1 |2024-01-02 7:00| 2024-01-02 8:00|
| 第二名| 1 |2024-01-02 9:00| 2024-01-02 10:00|
| #3| 1 |“2024-01-02 10:05”|“2024-01-02 11:00”|
| 第四名| 1 |“2024-01-02 11:05”|时间:2024-01-02 12:00|
| 第五名| 1 |2024-01-02 1:00|“2024-01-02 2:00”|
给定一个特定的记录,例如employee_worksheet #3,我如何查询以获得包括工作表#3的连续工作表?如果轮班的开始时间不超过上一个轮班结束时间的5分钟,则应考虑连续工作表。输出如下所示:
| ID|员工ID|时间开始|时间结束|
| --|--|--|--|
| 第二名| 1 |2024-01-02 9:00| 2024-01-02 10:00|
| #3| 1 |“2024-01-02 10:05”|“2024-01-02 11:00”|
| 第四名| 1 |“2024-01-02 11:05”|时间:2024-01-02 12:00|
先谢了。
我尝试了缺口和岛屿问题,但找不到我们在结果中间给出记录的情况。

e5nqia27

e5nqia271#

有时候,考虑消极条件并排除它们更容易。
对于移位a和B,它们重叠是a.time_end < b.time_start or a.time_start >B.time_start

SELECT a.employee_id, a.time_start, a.time_end
  FROM employee_worksheet a JOIN employee_worksheet b
        ON NOT (a.time_end < b.time_start OR
                a.time_start > b.time_end)
WHERE b.employee_id = 3

字符串
为了科普允许的5分钟间隔,您可以使用ADDDATE函数

SELECT a.employee_id, a.time_start, a.time_end
  FROM employee_worksheet a JOIN employee_worksheet b
        ON NOT (a.time_end <= DATEADD(b.time_start,INTERVAL -5 MINUTE) OR
                a.time_start >= DATEADD(b.time_end,INTERVAL  5 MINUTE)
WHERE b.employee_id = 3

相关问题