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
相关产品推荐
相关产品推荐

