mysql查询以比较开始时间和结束时间之间的时间表条目

时间:2018-07-22 11:59:04

标签: mysql sql

表就像:

lpDllName

他将参加每天完成的工作

Field 1 : employee_name
Field 2 : start_time
Field 3 : end_time
Field 4 : work_done

要求不应该有任何重叠的时间表条目。例如:,不允许RAM在start_time或end_time中再次输入[say] 10:20或11:10。

该查询是什么用于确定RAM是在start_time还是end_time中输入10:20或11:10。

请帮助

2 个答案:

答案 0 :(得分:1)

您可以使用此逻辑来获取另一个间隔的重叠

select t.*
from t
where @start_time < end_time and @end_time > start_time;

如果此查询不返回任何行,则没有重叠。您还可以使用count(*)获取重叠计数。

变量@start_time@end_time包含一个要检查的新间隔。

请注意,使用between来检查时间是不够的,因为9:00-11:45也会重叠,但是端点都不在表中的时间之间。

答案 1 :(得分:0)

是否要允许一个间隔的end_time等于下一个间隔的start_time?如果没有,那么以下内容将找到所有重叠部分:

select
    x.employee_name,
    x.start_time as start_interval_1,
    x.end_time as end_interval_1,
    y.start_time as start_interval_2,
    y.end_time as end_interval_2
from
    timesheet as x
    inner join timesheet as y on x.employee_name = y.employee_name
where
    (x.start_time between y.start_time and y.end_time
    or x.end_time between y.start_time and y.end_time
    or y.start_time between x.start_time and x.end_time
    or y.end_time between x.start_time and x.end_time)
    and y.start_time >= x.start_time
    and not (y.start_time = x.start_time and y.end_time = x.end_time);

如果要允许此类端点重叠,则需要将between子句替换为诸如x.start_time > y.start_time and x.start_time < y.end_time的子句。