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

CodeIgniter模型中如何正确查询创建时间小于24小时的数据?

问题分析与修复方案

你的查询无法工作主要有两个核心问题:

  1. PHP函数使用错误:strtotime(date('YmdHis'), INTERVAL 1 DAY) 完全不符合语法,INTERVAL是SQL的时间间隔语法,不能直接传入PHP的strtotime函数,且strtotime的参数顺序和用法也不对。
  2. 时间比较逻辑可能混淆:如果需求是获取24小时内创建的记录,原代码的<符号逻辑反了,应该用>=匹配“当前时间往前推24小时”之后的记录;如果是要找超过24小时的旧记录,才用<。

正确实现方案(分两种字段类型)

情况1:date_created是MySQL的datetime/timestamp类型

直接用SQL内置函数处理时间比较,避免PHP和数据库的时区差异问题:

public function checkDeposit($preOrder) 
{
    return $this->db->table('deposit')
        ->where('preorder_code', $preOrder)
        ->where('status', 0)
        // 匹配24小时内创建的记录(如果要找超过24小时的,把>=改成<)
        ->where('date_created >= DATE_SUB(NOW(), INTERVAL 1 DAY)')
        ->get()
        ->getRowArray(); // 如果需要所有匹配记录,替换为getResultArray()
}

情况2:date_created是字符串格式(比如YmdHis,例:20240520123456)

需要先把字符串转成MySQL可识别的时间格式,再做比较:

public function checkDeposit($preOrder) 
{
    return $this->db->table('deposit')
        ->where('preorder_code', $preOrder)
        ->where('status', 0)
        // 先将字符串转成datetime,再匹配24小时内的记录
        ->where('STR_TO_DATE(date_created, "%Y%m%d%H%i%s") >= DATE_SUB(NOW(), INTERVAL 1 DAY)')
        ->get()
        ->getRowArray(); // 多记录用getResultArray()
}

额外注意点

  • 如果你的需求是获取所有符合条件的记录,而不是单条,要把getRowArray()替换成getResultArray(),前者只返回第一条匹配数据。
  • 确保数据库的时区和PHP的时区一致,避免时间计算出现偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:37:25