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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:15:43