ci框架中使用between查询需确保时间格式匹配字段类型,推荐用$query->where(['created_at between' => [$start, $end]])防注入,避免手拼sql。

CI框架(如CodeIgniter)中使用 BETWEEN 进行时间段条件查询,本质是生成标准 SQL 的 WHERE column BETWEEN value1 AND value2 语句。关键在于正确传递时间值、避免时区/格式陷阱,并适配 CI 的查询构造器语法。
确认时间字段类型与存储格式
MySQL 中常用的时间字段类型有 DATETIME、TIMESTAMP 和 DATE。查询前必须明确:
- 数据库字段实际类型(例如
created_at DATETIME) - 存储值是否带时区(
TIMESTAMP自动转为 UTC 存储,DATETIME原样保存) - PHP 端传入的时间字符串格式是否匹配(推荐
Y-m-d H:i:s或Y-m-d)
使用 Query Builder 构造 BETWEEN 查询
CI 的 $this->db->where() 支持数组形式的 BETWEEN 写法,语义清晰且防注入:
-
$this->db->where('created_at BETWEEN "' . $start . '" AND "' . $end . '"');—— 手拼字符串,不推荐(易出错、无自动转义) $this->db->where('created_at >=', $start)->where('created_at —— 拆成两个条件,兼容性强-
$this->db->where('created_at BETWEEN ? AND ?', [$start, $end]);—— 使用占位符,安全且简洁(CI 3.1.11+ / CI4 原生支持)
示例(CI3):
$start = '2026-07-01 00:00:00';<br>$end = '2026-07-31 23:59:59';<br>$this->db->select('*')->from('orders')->where('created_at BETWEEN ? AND ?', [$start, $end]);<br>$query = $this->db->get();
处理日期边界与精度问题
BETWEEN 是闭区间,但实际业务常需“某月全部数据”,直接用 2026-07-01 到 2026-07-31 会漏掉 2026-07-31 10:30:00 这类时间。更稳妥做法:
- 查整月:用
start = '2026-07-01 00:00:00',end = '2026-08-01 00:00:00',再用替代 <code> - 或统一转为日期型比较:
DATE(created_at) BETWEEN '2026-07-01' AND '2026-07-31'(但会丢失索引效率)
CI4 中的等效写法
CI4 使用 Builder 类,推荐链式调用:
$builder->where('created_at >=', $start)->where('created_at- 或使用范围方法:
$builder->where('created_at', $start, '>=')->where('created_at', $end, ' - 注意:CI4 不直接支持
BETWEEN ? AND ?占位符语法,需拆解或手写where字符串(确保转义)











