在CodeIgniter中按日期范围获取记录

时间:2015-06-18 20:22:09

标签: php mysql codeigniter date range

我想在CodeIgniter中搜索两个日期之间的记录我尝试了很多方法但没有获得所需的结果。

我的模特

function search($date1 , $date2 ){
    $this->db->where('date<',$date1);
    $this->db->where('date >',$date2);
    $result = $this->db->get();
    return $result;
}

我的控制器

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中是 varchar

1 个答案:

答案 0 :(得分:0)

02-06-2015是在SQL中存储日期的一种非常不理想的方式,因为它们不会合理地进行整理。如果您可以切换为DATEDATETIME数据类型,那么您就可以在日期列上执行索引等很酷的操作。但那不是你提出的问题。

另外,我想知道你的不平等是否错了?您想要搜索的日期范围的开始和结束是什么?

回答您的具体问题:

DATE_FORMAT() MySQL function会将您的char日期转换为可折叠日期。特别是,

  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是&#39; 01-06-2015&#39;并且$date1是&#39; 04-06-2015&#39;这将回馈6月第二天和第三天的记录。

你可能想要这个[$ 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数据类型,则此方法可行。如果您在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