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

按今日、当月、当年统计数据:CodeIgniter分组统计失效求助

解决思路与代码实现

首先,你当前的代码只统计了所有material_status !=5数据的总和,没有按今日/当月/当年的时间维度做筛选和分组,所以自然得不到分维度的统计结果。下面给你两种可行的解决方案:


方案一:分三次查询(直观易维护)

这种方式分别对三个时间维度单独查询,代码逻辑清晰,适合快速实现:

1. 先确认表中的时间字段

首先要确保sys_material表有记录数据创建/更新时间的字段(比如create_time或update_time),下面示例假设用create_time,你需要替换成自己表中的实际字段名。

2. Controller中修改代码

// 统计今日的steam数量
$today_steamer = $this->dynamic_model->read(
    'sys_material', 
    0, 
    0, 
    'material_status != 5 AND DATE(create_time) = CURDATE()', 
    false, 
    false, 
    'SUM(material_piece_qty_printed) AS val'
)->row();
$today_val = $today_steamer->val ?? 0; // 处理null情况,默认0

// 统计当月的steam数量
$month_steamer = $this->dynamic_model->read(
    'sys_material', 
    0, 
    0, 
    'material_status != 5 AND DATE_FORMAT(create_time, "%Y-%m") = DATE_FORMAT(NOW(), "%Y-%m")', 
    false, 
    false, 
    'SUM(material_piece_qty_printed) AS val'
)->row();
$month_val = $month_steamer->val ?? 0;

// 统计当年的steam数量
$year_steamer = $this->dynamic_model->read(
    'sys_material', 
    0, 
    0, 
    'material_status != 5 AND YEAR(create_time) = YEAR(NOW())', 
    false, 
    false, 
    'SUM(material_piece_qty_printed) AS val'
)->row();
$year_val = $year_steamer->val ?? 0;

// 赋值到视图变量
$this->view['data']['ts_today'] = $today_val;
$this->view['data']['ts_month'] = $month_val;
$this->view['data']['ts_year'] = $year_val;

3. 视图中输出

steam today: <?php echo $ts_today; ?> 
steam this month: <?php echo $ts_month; ?> 
steam this year: <?php echo $ts_year; ?>

方案二:一次查询获取三个结果(性能更优)

如果想减少数据库查询次数,可以用CASE WHEN在单条SQL中同时计算三个维度的总和:

1. 自定义Model查询(推荐)

因为你的dynamic_model->read方法可能不支持复杂的聚合查询,建议在Model中新增一个方法:

// 在dynamic_model中添加方法
public function get_steamer_stats() {
    $sql = "
        SELECT 
            SUM(CASE WHEN DATE(create_time) = CURDATE() THEN material_piece_qty_printed ELSE 0 END) AS today_val,
            SUM(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') THEN material_piece_qty_printed ELSE 0 END) AS month_val,
            SUM(CASE WHEN YEAR(create_time) = YEAR(NOW()) THEN material_piece_qty_printed ELSE 0 END) AS year_val
        FROM sys_material 
        WHERE material_status != 5
    ";
    return $this->db->query($sql)->row();
}

2. Controller中调用

$stats = $this->dynamic_model->get_steamer_stats();
$this->view['data']['ts_today'] = $stats->today_val ?? 0;
$this->view['data']['ts_month'] = $stats->month_val ?? 0;
$this->view['data']['ts_year'] = $stats->year_val ?? 0;

3. 视图输出和方案一一致


关键注意事项

  • 替换create_time为你表中实际的时间字段名;
  • 如果时间字段是字符串类型,需要先转换为日期格式再比较(比如STR_TO_DATE(create_time, '%Y-%m-%d %H:%i:%s'));
  • 用?? 0处理统计结果为null的情况(当某个维度没有数据时,SUM会返回null,显示0更友好)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:20