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

PHP使用while循环计算每年12月社保累计缴费总额问题求解

错误原因

  • 非12月的缴费金额未计入累计:你当前的代码只有在遍历到12月的缴费记录时才会修改$total的值,1-11月的缴费金额完全没有累加,基数本身就错了。
  • 12月的金额被重复计算:当$total初始为0时,你先执行了$total = $array['employee_amount'],紧接着又执行了$total = $total + $array['employee_amount'],相当于12月的金额被加了两次,结果自然偏高。
  • 未按年份区分统计逻辑:如果需要输出每年12月的当年累计/历史累计,现有逻辑没有提取年份做判断,跨年统计时会出现逻辑混乱。

修正方案

场景1:统计从首次缴费到每年12月末的历史累计总额

<?php 
$total = 0;
// 查询时按缴费日期排序更稳妥,避免自增ID和日期顺序不一致
$c = mysqli_query($con, "SELECT * FROM payroll_contribution_pssf WHERE employee_id='3' ORDER BY payroll_date ASC");
while($array = mysqli_fetch_array($c)) {
    // 每一条记录的金额都要累加,不管是哪个月的
    $total += $array['employee_amount'];
    $payrollTimestamp = strtotime($array['payroll_date']);
    $m = date('m', $payrollTimestamp);
    // 输出当前记录
    echo $array['payroll_date']." ".$array['employee_amount']."<br>";
    // 到12月的记录时输出累计值
    if($m == 12) {
        $y = date('Y', $payrollTimestamp);
        echo $y."年末累计:".number_format($total, 0)."<br>";  
    }
}
?>

场景2:统计每年当年的缴费总额,12月末输出当年累计

<?php 
$yearTotal = 0;
$lastYear = null;
$c = mysqli_query($con, "SELECT * FROM payroll_contribution_pssf WHERE employee_id='3' ORDER BY payroll_date ASC");
while($array = mysqli_fetch_array($c)) {
    $payrollTimestamp = strtotime($array['payroll_date']);
    $y = date('Y', $payrollTimestamp);
    $m = date('m', $payrollTimestamp);
    // 跨年时重置当年累计
    if ($lastYear !== null && $y != $lastYear) {
        $yearTotal = 0;
    }
    $yearTotal += $array['employee_amount'];
    // 输出当前记录
    echo $array['payroll_date']." ".$array['employee_amount']."<br>";
    // 12月输出当年累计
    if($m == 12) {
        echo $y."年当年累计:".number_format($yearTotal, 0)."<br>";  
    }
    $lastYear = $y;
}
?>

优化建议

可以直接通过SQL分组统计,不用在PHP层循环遍历计算,效率更高:

-- 统计每年年末累计(历史总累计)
SELECT 
    YEAR(payroll_date) AS stat_year,
    SUM(employee_amount) OVER (ORDER BY YEAR(payroll_date)) AS total_amount
FROM payroll_contribution_pssf 
WHERE employee_id='3'
GROUP BY YEAR(payroll_date)

-- 统计每年当年累计
SELECT 
    YEAR(payroll_date) AS stat_year,
    SUM(employee_amount) AS year_total_amount
FROM payroll_contribution_pssf 
WHERE employee_id='3'
GROUP BY YEAR(payroll_date)

内容的提问来源于stack exchange,提问作者jadago

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:15:03