MySQL查询需求:筛选2017年结束任职的医院员工
筛选2017年结束任职员工的MySQL查询方案
嘿,很高兴能帮到你!针对医院员工频繁转岗、每次转岗生成新行的场景,我给你整理了几种不同需求下的查询方案,先假设你的任职记录表(比如叫employee_assignments)包含以下核心字段:employee_id(员工ID)、department_id(部门ID)、start_date(任职开始日期)、end_date(任职结束日期,当前在职的员工该字段可能为NULL)。
基础需求:获取所有2017年结束任职的记录
如果你需要查看所有在2017年结束某段任职(包括转岗、离职)的明细记录,用这个查询:
SELECT * FROM employee_assignments WHERE end_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59';
为什么用范围查询而不是
YEAR(end_date) = 2017?因为YEAR()函数会让end_date字段上的索引失效,数据量大的时候查询效率会低很多,范围查询能利用索引提速。
进阶需求:获取所有在2017年有过任职结束的员工(去重)
如果只需要知道哪些员工在2017年有过任职结束(不管转岗几次),可以用DISTINCT去重,或者关联员工表获取更多信息:
SELECT DISTINCT ea.employee_id, e.employee_name, e.position FROM employee_assignments ea JOIN employees e ON ea.employee_id = e.id WHERE ea.end_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59';
精准需求:获取2017年最终离职的员工(排除转岗)
如果你的目标是找出在2017年彻底离职、而非内部转岗的员工,就需要判断该员工的最后一段任职结束于2017年(因为转岗的员工后续会有新的任职记录):
SELECT ea.*, e.employee_name FROM employee_assignments ea JOIN employees e ON ea.employee_id = e.id JOIN ( -- 先找出每个员工的最后一次任职结束日期 SELECT employee_id, MAX(end_date) AS last_end_date FROM employee_assignments GROUP BY employee_id ) AS last_assignment ON ea.employee_id = last_assignment.employee_id AND ea.end_date = last_assignment.last_end_date WHERE last_assignment.last_end_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59';
注意:如果当前在职员工的
end_date是NULL,这个查询会自动排除他们,因为MAX(end_date)不会取到NULL,正好符合“结束任职”的筛选条件。
内容的提问来源于stack exchange,提问作者Dennis Andreasen
相关产品推荐
相关产品推荐

