我想在 CodeIgniter 中搜索两个日期之间的记录我尝试了很多方法但没有得到所需的结果。
我的模型
function search($date1 , $date2 ){
$this->db->where('date<',$date1);
$this->db->where('date >',$date2);
$result = $this->db->get();
return $result;
}
我的 Controller
function getsearch(){
$date1 = $this->input->post('txtdate1'); // 02-06-2015
$date2 = $this->input->post('txtdate2'); // 19-06-2015
$data['result'] = $this->result_model->search($date1,$date2);
$this->load->view("search_view",$data);
}
现在我想要 2 到 19 之间的所有行,但我什么也没得到。 注意: mysql中的date类型为varchar
最佳答案
02-06-2015
确实是在 SQL 中存储日期的次优方式,因为它们无法合理地进行排序。如果您可以切换到 DATE
或 DATETIME
数据类型,您将能够执行一些很酷的操作,例如在日期列上建立索引。但这不是你问的。
另外,我想知道你的不等式是否有误?您要搜索的日期范围的开始日期和结束日期是多少?
回答您的具体问题:
DATE_FORMAT()
MySQL function会将您的字符日期转换为可整理日期。特别是,
DATE_FORMAT('02-06-2015', '%d-%m-%Y')
从您的日期中获取一个 DATE
对象。
所以这种 php 代码可以工作
$this->db->where("DATE_FORMAT(date, '%d-%m-%Y') < ","DATE_FORMAT('$date1', '%d-%m-%Y')");
$this->db->where("DATE_FORMAT(date, '%d-%m-%Y') > ","DATE_FORMAT('$date2', '%d-%m-%Y'):);
如果 $date2
是“01-06-2015”并且 $date1
是“04-06-2015”,这将返回第二个的记录和六月的第三天。
您可能需要用这个来代替 [$date1,$date2] 范围。
$this->db->where("DATE_FORMAT(date, '%d-%m-%Y') >= ","DATE_FORMAT('$date1', '%d-%m-%Y')");
$this->db->where("DATE_FORMAT(date, '%d-%m-%Y') < ","DATE_FORMAT('$date2', '%d-%m-%Y') + INTERVAL 1 DAY");
请注意,您的date
列包含在一个函数中。这无法使用任何索引来对日期进行表搜索。如果您的 date
列具有 DATE
数据类型,则此方法可行。如果您在日期
上有一个索引,MySQL 将使用高效的范围扫描。
$this->db->where("DATE_FORMAT(date, '%d-%m-%Y') >= ","'$date1'");
$this->db->where("DATE_FORMAT(date, '%d-%m-%Y') < ","'$date2' + INTERVAL 1 DAY");
在原始 SQL 中,这会导致......
WHERE DATE_FORMAT(date, '%d-%m-%Y') >= '$date1'
AND DATE_FORMAT(date, '%d-%m-%Y') < '$date2' + INTERVAL 1 DAY
关于php - 在 CodeIgniter 中按日期范围获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925115/