SQL计算请假天数:同日期DATEDIFF求和需加1天的问题
解决单天请假天数核算的SQL问题
你遇到的问题核心是MySQL的DATEDIFF()函数特性:它返回的是结束日期与起始日期的天数差(不包含起始日期),所以当起止日期相同时会返回0,而你需要这种单天请假的情况计为1天。
核心解决方案
只需要给DATEDIFF()的结果加1即可,这样能同时满足两种场景的核算需求:
- 单天请假(起止日期相同):
0 + 1 = 1天,符合你的要求 - 跨天请假:
天数差 + 1,包含起止日期,这也是常规请假天数的核算逻辑(比如01/01到01/02会被计算为2天,如果你业务上确实需要跨天仅计1天,可以看后面的补充说明)
修改后的SQL关键部分
把你原SQL中的求和逻辑替换成下面的写法:
SUM( DATEDIFF(STR_TO_DATE(lr.to_date, '%m/%d/%Y'), STR_TO_DATE(lr.from_date, '%m/%d/%Y')) + 1 )
完整修改后的SQL语句
结合你提供的原语句,调整后的完整代码如下(注意修正了CASE中判断NULL的语法错误,SQL里判断NULL必须用IS NULL):
$sql = "SELECT l.id as typeid, l.*, ud.firstname, ud.lastname, ud.email, l.leave_starting_from, l.leave_partial_from, ud.joining_date, l.typename, l.no_of_leave_days, ( CASE WHEN SUM(DATEDIFF(STR_TO_DATE(lr.to_date, '%m/%d/%Y'), STR_TO_DATE(lr.from_date, '%m/%d/%Y')) + 1) IS NULL THEN '0' ELSE SUM(DATEDIFF(STR_TO_DATE(lr.to_date, '%m/%d/%Y'), STR_TO_DATE(lr.from_date, '%m/%d/%Y')) + 1) END ) AS total_leave_days FROM -- 这里保留你原有的表关联逻辑即可 your_table l JOIN user_details ud ON l.user_id = ud.id JOIN leave_records lr ON l.id = lr.leave_id GROUP BY l.id, ud.firstname, ud.lastname, ud.email, l.leave_starting_from, l.leave_partial_from, ud.joining_date, l.typename, l.no_of_leave_days ";
特殊业务场景补充
如果你的业务规则确实是不管跨多少天,只要跨天就计1天,单天请假也计1天,可以用CASE单独处理:
SUM( CASE WHEN DATEDIFF(STR_TO_DATE(lr.to_date, '%m/%d/%Y'), STR_TO_DATE(lr.from_date, '%m/%d/%Y')) = 0 THEN 1 ELSE 1 END )
不过这种逻辑不太符合常规的请假天数核算,更推荐第一种加1的方案。
内容的提问来源于stack exchange,提问作者Shashank Bhat
相关产品推荐
相关产品推荐

