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

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万条时查询速度会明显下降,非必要不使用。

快速排查步骤

如果调整后仍有问题,可以按以下顺序定位:

  1. 执行查询后打印CI生成的原生SQL:echo $this->db->last_query();,把SQL复制到数据库客户端手动执行,检查传入的日期参数、拼接的条件是否符合预期
  2. 核对2022-06-22的记录内容,确认customer、deliveryboy字段值不会被你写的like条件意外过滤
  3. 检查传入的$fromdate、$todate参数实际值,确认传参范围确实包含2022-06-22,没有出现传参错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:09:46