CodeIgniter查询构建器筛选VARCHAR类型日期时间字段问题
问题解决方法
核心问题分析
你的代码存在两个关键错误,导致无法返回结果:
- 日期比较逻辑完全写反:
$date1是当日0点(更早的时间节点),$date2应该是当日23:59:59(你写错成11:59:59了),但你用了txndate <= $date1和txndate >= $date2,相当于筛选“比0点早且比23点晚”的数据,这本身就不可能存在。 - VARCHAR类型日期直接字符串比较不可靠:你的
txndate是DD-MM-YYYY HH:MM:SS格式的字符串,直接用字符串比较会按字符顺序判断,比如30-11-2023会被认为比01-12-2023大(因为第一个字符'3' > '0'),但实际日期后者更晚,导致筛选逻辑完全错误。
解决方案
方案1:不改字段类型,用SQL函数转换日期后比较
利用MySQL的STR_TO_DATE()函数将字符串日期转为datetime类型再做比较,同时修正逻辑错误:
$this->db->select('userid, roll, amount, txnnumber, bankref, txntype, txndate, authstatus, feetype'); // $sid为表单传入的DD-MM-YYYY格式日期 $start_date = $sid . " 00:00:00"; $end_date = $sid . " 23:59:59"; // 转换字符串日期为datetime类型后再比较 $this->db->where("STR_TO_DATE(txndate, '%d-%m-%Y %H:%i:%s') >= STR_TO_DATE(?, '%d-%m-%Y %H:%i:%s')", $start_date); $this->db->where("STR_TO_DATE(txndate, '%d-%m-%Y %H:%i:%s') <= STR_TO_DATE(?, '%d-%m-%Y %H:%i:%s')", $end_date); // 执行查询并返回结果 $query = $this->db->get('你的表名'); return $query->result();
方案2:修改字段类型为DATETIME(推荐)
将txndate字段从VARCHAR改成DATETIME类型,这是数据库存储日期的规范做法,后续日期操作会更简单:
- 先执行SQL修改字段(修改前先转换现有数据):
-- 先把现有VARCHAR类型的日期转成DATETIME格式 UPDATE 你的表名 SET txndate = STR_TO_DATE(txndate, '%d-%m-%Y %H:%i:%s'); -- 修改字段类型 ALTER TABLE 你的表名 MODIFY COLUMN txndate DATETIME;
- 修正后的模型代码:
$this->db->select('userid, roll, amount, txnnumber, bankref, txntype, txndate, authstatus, feetype'); $start_date = $sid . " 00:00:00"; $end_date = $sid . " 23:59:59"; $this->db->where('txndate >=', $start_date); $this->db->where('txndate <=', $end_date); $query = $this->db->get('你的表名'); return $query->result();
内容的提问来源于stack exchange,提问作者ZNO
相关产品推荐
相关产品推荐

