根据“上班时间”和“上班时间”查找在特定时间之间没有工作的员工

时间:2019-11-11 13:46:16

标签: mysql database sql-date-functions

我为员工提供了一个“ 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点之间没有工作的员工?

2 个答案:

答案 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'
)