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

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类型,这是数据库存储日期的规范做法,后续日期操作会更简单:

  1. 先执行SQL修改字段(修改前先转换现有数据):
-- 先把现有VARCHAR类型的日期转成DATETIME格式
UPDATE 你的表名 SET txndate = STR_TO_DATE(txndate, '%d-%m-%Y %H:%i:%s');
-- 修改字段类型
ALTER TABLE 你的表名 MODIFY COLUMN txndate DATETIME;
  1. 修正后的模型代码:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:25:21