我为员工提供了一个“ clock in”表,该表具有属性开始时间和结束时间。 每位员工在开始和结束工作时都按时进出,表与此类似:
Employee_no Start time End time
16 2019-04-01 08:00:20 2019-04-02 12:00:10
13 2019-04-01 10:00:20 2019-04-01 14:00:20
31 2019-04-01 14:00:20 2019-04-01 17:00:20
如何根据开始时间和结束时间查找在13点至16点之间没有工作的员工?
答案 0 :(得分:0)
您可以使用聚合和having
子句来展示从未在13h和16h之间工作的员工:
select employee_no
from mytable
group by employee_no
having max(hour(start_time) <= 16 and hour(end_time) >= 13) = 0
如果您希望表中的记录的完整列表不与13h-16h时隙重叠,则:
select *
from mytable
where not (hour(start_time) <= 16 and hour(end_time) >= 13)
答案 1 :(得分:0)
如果您有单独的Employee表,最好的方法是比较两个表中的数据。
假设这两个表分别称为Clocks and Employees,此查询将查找您在4月2日到13日之间工作的所有雇员:
select Employee_no
from clocks
where Start_time<'2019-04-02 16:00:00' and End_time>'2019-04-02 13:00:00'
将此作为子查询,您可以检查“雇员”表:
select Employee_no
from Employees
where Employee_no not in(
select Employee_no
from clocks
where Start_time<'2019-04-02 16:00:00' or End_time>'2019-04-02 13:00:00'
)