表就像:
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。
请帮助
答案 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
的子句。