You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:10:59