MySQL多子查询行日期差计算:员工在职总天数统计实现咨询
搞定MySQL中员工总工作天数计算的问题
嘿,别纠结循环的事儿啦!MySQL本身就擅长集合操作,咱们用简单的关联和聚合函数就能实现你要的效果,根本用不着循环。直接上解决方案:
SELECT t1.emp_id, t1.emp_name, COALESCE(SUM(DATEDIFF(COALESCE(t2.End_date, CURDATE()), t2.Start_date)), 0) AS Total_days FROM 表1 t1 LEFT JOIN 表2 t2 ON t1.emp_id = t2.emp_id GROUP BY t1.emp_id, t1.emp_name;
给你拆解一下代码逻辑:
- LEFT JOIN关联两张表:确保像CCC那样在表2里没任何记录的员工,也能出现在结果里,不会被漏掉。
- COALESCE(t2.End_date, CURDATE()):专门处理End_date为空的情况——空值就用当前日期
CURDATE()代替,这样就能把未结束的时间段算到今天。 - DATEDIFF(结束日期, 开始日期):计算单个时间段的天数差,注意参数顺序是先结束后开始,返回的是两个日期之间的天数差值。
- SUM(...):把同一个员工的所有时间段天数加起来,得到总工作天数。
- COALESCE(SUM(...), 0):如果员工没任何时间段记录(比如CCC),SUM会返回NULL,这时候用COALESCE把它转成0,完美匹配你的预期输出。
对应你的测试数据验证:
- 员工AAA(emp_id=1)的三个时间段累加后正好是3030天
- 员工BBB(emp_id=2)的两个时间段总和是3273天
- 员工CCC(emp_id=3)无记录,直接返回0
这个方法全程用集合操作,效率高还容易维护,比循环靠谱多啦!
内容的提问来源于stack exchange,提问作者techworld
相关产品推荐
相关产品推荐

