CodeIgniter PHP日期区间查询缺失2022-06-22记录问题排查
问题根因
查询始终缺失2022-06-22记录的核心原因是日期比较边界逻辑错误,绝大多数同类问题都属于以下场景:
- 你表中的
date字段实际是DATETIME/TIMESTAMP类型,存储值带时分秒(例如2022-06-22 13:45:02),但传入的$todate是纯日期格式2022-06-22。MySQL做比较时会自动把纯日期转为当日零点时间2022-06-22 00:00:00,此时date <= $todate的条件等价于匹配22号零点之前的记录,所有22号零点之后生成的数据都会被过滤。 - 少数情况是传入的日期参数格式不标准(带多余空格、分隔符不是横杠、PHP和数据库时区配置不一致),导致比较逻辑异常。
修复方案
方案1:调整范围查询逻辑(优先推荐)
把结束日期的匹配规则改为「小于结束日期+1天」,既能覆盖全天所有时分秒的记录,也不会破坏date字段的索引,性能最优。修改后的代码如下:
function searchstatus($clients,$fromdate,$todate,$deliveryboy) { // 结束日期加1天,用左闭右开的区间匹配 $next_day = date('Y-m-d', strtotime($todate . ' +1 day')); $this->db->where('date >=', $fromdate); $this->db->where('date <', $next_day); if ($clients) { $this->db->like('customer', $clients); } if ($deliveryboy) { $this->db->like('deliveryboy', $deliveryboy); } $this->db->order_by('date','ASC'); $query = $this->db->get('delivered'); return $query->result(); }
方案2:格式化字段后匹配(仅适合小表场景)
如果不需要考虑查询性能,也可以用MySQL内置DATE()函数把字段值转为纯日期格式再比较:
$this->db->where('DATE(date) >=', $fromdate); $this->db->where('DATE(date) <=', $todate);
注意:该写法会导致
date字段上的索引失效,表数据量超过10万条时查询速度会明显下降,非必要不使用。
快速排查步骤
如果调整后仍有问题,可以按以下顺序定位:
- 执行查询后打印CI生成的原生SQL:
echo $this->db->last_query();,把SQL复制到数据库客户端手动执行,检查传入的日期参数、拼接的条件是否符合预期 - 核对2022-06-22的记录内容,确认
customer、deliveryboy字段值不会被你写的like条件意外过滤 - 检查传入的
$fromdate、$todate参数实际值,确认传参范围确实包含2022-06-22,没有出现传参错误
内容的提问来源于stack exchange,提问作者ZNO
相关产品推荐
相关产品推荐

