CodeIgniter模型中如何正确查询创建时间小于24小时的数据?
问题分析与修复方案
你的查询无法工作主要有两个核心问题:
- PHP函数使用错误:
strtotime(date('YmdHis'), INTERVAL 1 DAY)完全不符合语法,INTERVAL是SQL的时间间隔语法,不能直接传入PHP的strtotime函数,且strtotime的参数顺序和用法也不对。 - 时间比较逻辑可能混淆:如果需求是获取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
相关产品推荐
相关产品推荐

