SQL查询问题咨询:如何正确找出公司最资深的部门?
原SQL的问题及修正建议
原SQL存在的问题
- 入职年限计算不准确:
YEAR(NOW()) - YEAR(hire_date)只算年份差,完全忽略月份和日期。比如员工2023年12月31日入职,当前是2024年1月1日,年份差为1,但实际仅入职1天;反之员工2024年1月1日入职,当前是2024年12月31日,年份差为0,但实际已入职近一年。这种计算方式会导致入职年限判断出现偏差。 - 逻辑偏离需求核心:需求是“部门内员工入职越早,部门资历越老”,本质是比各部门的最早入职日期,而非部门内最大的入职年限。虽然最早入职员工的年限理论上最大,但直接用最早入职日期判断更准确直观,还能避免年限计算误差。
修正后的SQL写法
如果要按资深程度排序所有部门:
SELECT department, MIN(hire_date) AS earliest_hire_date, TIMESTAMPDIFF(YEAR, MIN(hire_date), NOW()) AS seniority_years FROM human_resources GROUP BY department ORDER BY earliest_hire_date ASC; -- 最早入职的部门排最前,即最资深
如果只需要找出最资深的单个部门:
SELECT department, MIN(hire_date) AS earliest_hire_date, TIMESTAMPDIFF(YEAR, MIN(hire_date), NOW()) AS seniority_years FROM human_resources GROUP BY department ORDER BY earliest_hire_date ASC LIMIT 1;
说明
MIN(hire_date)直接获取部门内最早入职日期,这是判断部门资深程度的核心依据。TIMESTAMPDIFF(YEAR, MIN(hire_date), NOW())能准确计算从最早入职到现在的年份差,避免了单纯年份相减的误差(该函数适用于MySQL,其他数据库有类似替代函数,比如PostgreSQL的AGE())。
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

