【问题标题】:Employee available for task between a date range员工可在日期范围内执行任务
【发布时间】:2015-07-14 08:00:04
【问题描述】:

我一直在从事员工工作管理项目,但我有点卡住了。我有 3 张桌子:

1:员工 empid, empFirst empLast 1 乔恩·史密斯 2 标记路 3简大厅 2:假期 id 员工 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:分配的任务 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

我不确定如何查询表以查看谁可用于某个日期范围内的任务(多个用户分配给同一任务)。我有一个查询:

所以如果你把假期表拿出来,如果等式只运行下面的查询

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 乔恩史密斯(他有空) 2 标记路 2 标记路

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

我想先查询假期表,看看他们是否在度假,然后查询任务表,看看他们是否已经在日期范围内有任务,然后结果告诉我该任务是如何可用的。

【问题讨论】:

  • 太累了,无法获得完整的答案,但是,尝试换一种方式思考。您正在尝试查看该员工是否在 2015-07-29 14:30:002015-07-29 18:30:00 之间有空,因此,在您的 WHERE 子句中,查看 2015-07-29 14:30:00 是否不在 taskassigned.startTasktaskassigned.endTask 之间,以及是否 2015-07-29 18:30:00不在taskassigned.startTasktaskassigned.endTask 之间。

标签: mysql date date-range


【解决方案1】:

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

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
    )
)

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

【讨论】:

  • 嗨,谢谢您的回答,但它仍然不是我想要的正确结果。仍然可以得到标记这是因为他分配了其他任务。我已经更改了假期开始和结束日期格式而不是时间戳,这是有道理的。但该任务需要时间戳,因为该任务可能只需要 2 小时。再次感谢您的宝贵时间...
  • 结果我得到了 emp 1 jon smith epm 2 mark road emp2 mark road epm 2 mark road emp 2 mark road 但再次感谢 mark 不可用
  • 您好,我的项目将于周一在大学(第一年)完成,我真的会为此苦苦挣扎。您认为查询日期之间的人员是否会更好,然后根据employeesId 列表查询结果id 不在员工列表中的位置。迷路了,如果你有时间,希望能得到一些帮助谢谢
【解决方案2】:

您好,我现在没有合适的测试工具,但您可以尝试以下方法:

使用日期比较时:

  • 尝试转换/转换为 DATE(确保不包括时间)以确保结果正确。

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

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

  • 先加入假期表,然后再将结果加入任务分配表。

  • 先加入任务分配表,然后再将结果加入假期表

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

【讨论】:

  • 也可以尝试使用>
  • 我已将假日日期格式更改为时间戳,但任务仍需要时间戳,因为大头钉可能只需要 2 小时。
  • 你好,我还在研究如何使用内连接来获得你想要的结果,但是这里是非内连接语法的查询:select * from emp as e where e.id in (select h.emp_id from holiday as h where h.end_date < '2013-08-07' and '2013-08-07' > h.start_date ) and e.id in (select t.emp_id from task as t where t.end_date < '2013-08-07 17:00:00' and '2013-08-07 17:00:00' > t.start_date ) 当然改变表名,列名和日期字符串到您的值
  • 嗨,对不起,我的上一个答案没有日期范围,但您可以修改以在日期范围内检查。
  • 1 个问题,如果您正在寻找已完成任务和假期的员工,您不应该只检查任何小于当前日期的任务和假期结束日期吗?因为在一个日期范围内进行意味着任何雇主的任务/假期的结束日期仍在指定的日期范围内工作。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多