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

CodeIgniter查询指定月份数据行数返回0的问题排查

问题分析与修复方案

嘿,我一眼就看出问题所在啦!你的代码里有两个关键错误,导致查询结果一直返回0:

1. 数据类型不匹配

你的数据库字段td_created_at是时间戳(数字格式,比如1577836800),但你在查询里用了格式化后的日期字符串(比如"01-12-2024")直接和它比较——这就像拿字符串和数字比大小,数据库根本没法匹配到正确的数据。

2. 日期解析存在歧义

你用strtotime("1-12-".$yr)生成日期,但strtotime默认会把d-m-Y格式的字符串当成m-d-Y解析(比如1-12-2019会被解析成2019年1月12日,而不是12月1日),这直接导致你的时间范围完全错了。


修复后的代码

我们需要把日期转换成时间戳,和数据库的字段类型保持一致,同时用更明确的方式指定日期格式避免解析错误:

// 获取指定年份12月的数据(建议把函数名改成getDecSale更贴合功能)
public function getDecSale() {
    $yr = date('Y');
    // 明确指定日期时间,避免strtotime解析歧义
    $startOfDec = strtotime("01-12-$yr 00:00:00");
    $endOfDec = strtotime("31-12-$yr 23:59:59");
    
    // 直接用时间戳和数据库的timestamp字段比较
    $this->db->where('td_created_at >=', $startOfDec);
    $this->db->where('td_created_at <=', $endOfDec);
    
    $query = $this->db->get('zd_item_downloads');
    return $query->num_rows();
}

备选方案:用数据库函数转换(适合灵活匹配年月的场景)

如果需要更灵活的年月匹配,也可以借助数据库的函数把时间戳转成日期格式后再比较,比如MySQL的FROM_UNIXTIME:

public function getDecSale() {
    $yr = date('Y');
    // 把时间戳转成日期后,提取年份和月份进行匹配
    $this->db->where("DATE_FORMAT(FROM_UNIXTIME(td_created_at), '%Y-%m') = '$yr-12'");
    $query = $this->db->get('zd_item_downloads');
    return $query->num_rows();
}

这样修改后,就能正确查询到目标月份的数据行数啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:54:16