员工可在某个日期范围内完成任务

Employee available for task between a date range

我一直在做一个员工工作管理项目,我有点卡住了。我有 3 tables:

1:  employees

    empid,       empFirst     empLast
    1            jon          smith
    2            mark         road
    3            jane         hall
2:  holiday

    id        employee id      datestart       dateend
    1         2                2015-08-07      2015-08-12
    2         3                2015-07-4       2015-07-11
    3         2                2015-07-20      2015-07-24
3: Task Assigned

   id      taskid        assignedTo(userid)        startTask      endTask
   1       1               1                     2015-07-10      2015-07-14
   2       2               2                     2015-07-29      2015-07-29
   3       2               3                     2015-07-18      2015-07-30
   4       3               2                     2015-08-30      2015-09-03
   5       4               2                     2015-09-10      2015-09-03

我不确定如何查询 table 以查看谁可以在日期范围内执行任务(分配给同一任务的多个用户)。我有一个查询,我会在这里:

所以如果你休假 table 如果等式只是 运行 下面的查询

SELECT employees.empId, employees.empFirst, employees.empLast
FROM employees 
LEFT JOIN taskassigned 
ON employees.empId = taskassigned.assignedTo
WHERE taskassigned.assignedTo IS NULL or  
 not (taskassigned.startTask  BETWEEN '2015-07-29 14:30:00' AND '2015-07-29 18:30:00' 
   or taskassigned.endTask  BETWEEN '2015-07-29 14:30:00' AND '2015-07-29 18:30:00')

我得到的结果是:

empId  empFirst empLast
1      jon      smith   (he is available)
2      mark     road    
2      mark     road

如您所见,Mark 在该日期(在任务 table 中)不可用。

我想查询假期 table 先看看他们是否在假期 然后任务 table 查看他们是否已经在日期范围内有任务 然后显示结果我怎么可以完成任务。

我目前无法测试,但请尝试:

SELECT employees.empId, employees.empFirst, employees.empLast
FROM employees 
LEFT JOIN taskassigned 
ON employees.empId = taskassigned.assignedTo
LEFT JOIN holiday
ON employees.empId = holiday.employeeId
WHERE (
    taskassigned.assignedTo IS NULL
    OR (
        '2015-07-29 14:30:00'  NOT BETWEEN taskassigned.startTask AND taskassigned.endTask
        AND '2015-07-29 18:30:00'  NOT BETWEEN taskassigned.startTask AND taskassigned.endTask
    )
)
AND (
    holiday.employeeId IS NULL
    OR (
        '2015-07-29 14:30:00'  NOT BETWEEN holiday.dateStart AND holiday.dateEnd
        AND '2015-07-29 18:30:00'  NOT BETWEEN holiday.dateStart AND holiday.dateEnd
    )
)

这将检查指定的开始日期是否不在分配任务的开始或结束日期之间,以及指定的结束日期是否不在分配任务的开始或结束日期之间,然后执行假期也一样。

您好,我现在没有合适的测试工具,但您可以尝试这样做:

使用日期比较时:

  • 尝试 convert/cast DATE(确保不包括时间)以确保结果正确。

  • 据我所知,在开始日期和结束日期之间使用时也包括在内(可能在某些 RDMS 功能中)

也包括假期,你可以这样做(或者):

  • 首先加入假期 table 然后根据结果再次加入分配的任务 table。

  • 首先加入分配的任务 table 然后根据结果再次加入假期 table

抱歉没有包含代码,因为我没有时间设置。