MySQL datetime条件查询PHP问题:指定时间数据无法匹配
看起来你是想精准匹配tasks表中time字段等于2018-05-03 11:02:00的记录,但当前的SQL条件完全偏离了需求,还存在SQL注入风险,我来帮你一步步解决:
为什么原代码没有返回结果?
你原查询里的条件AND time > DATE_SUB(CURDATE(), INTERVAL 1 HOUR),意思是筛选time大于当前日期减去1小时的记录。比如现在如果是2024年的某个时间,这个条件只会匹配最近1小时内的数据,和你要找的2018年的记录完全不匹配,自然查不到结果。
正确的查询方式(优先推荐安全写法)
首先绝对不要直接把变量(比如$datas[$i])拼进SQL语句,这会引发严重的SQL注入漏洞。从$this->db判断你应该在用类似CodeIgniter的框架,我推荐用框架自带的安全写法:
方法1:使用查询构造器(最简洁安全)
// 定义要匹配的目标时间 $target_time = '2018-05-03 11:02:00'; $staff_id = $datas[$i]; // 构建查询,框架自动处理参数绑定,避免注入 $query = $this->db->select_sum('count', 'total') ->select_sum('status', 'is_completed') ->from('tasks') ->where('staff_id', $staff_id) ->where('time', $target_time) ->get(); // 处理查询结果 if ($query->num_rows() > 0) { $result = $query->row(); echo "总计数:" . $result->total . "<br>"; echo "已完成数:" . $result->is_completed . "<br>"; } else { echo "没有找到匹配的记录"; }
方法2:原生SQL+参数绑定
如果更习惯写原生SQL,用占位符?绑定参数同样安全:
$target_time = '2018-05-03 11:02:00'; $staff_id = $datas[$i]; $query = $this->db->query( "SELECT sum(count) As total, sum(status) As is_completed FROM `tasks` WHERE `staff_id` = ? AND `time` = ?", array($staff_id, $target_time) ); // 结果处理逻辑同上
额外注意事项
- 确保
tasks表的time字段类型是DATETIME(或TIMESTAMP),且存储格式是YYYY-MM-DD HH:MM:SS,和你传入的时间格式一致。 - 如果需要匹配该时间的范围(比如整小时内的数据),可以把条件改成
time BETWEEN '2018-05-03 11:00:00' AND '2018-05-03 11:59:59',但根据你的描述,精准匹配用=就足够了。
内容的提问来源于stack exchange,提问作者austin
相关产品推荐
相关产品推荐

