2016-12-10 158 views
0

我需要在两个日期之间获取数据,但它不工作。比较月份和年份Mysql

我的表 -

enter image description here

从日期和日期参数 -

$from_date = '2016-12'; 
$to_date = '2017-03'; 

表列类型是VARCHAR

$this->db->select('*', FAlSE); 
$this->db->where('t.Flag', '0'); 
$this->db->where('tpd.Status', $status); 
$this->db->where("STR_TO_DATE(tpd.Month, '%Y-%m') >=", date($from_date)); 
$this->db->where("STR_TO_DATE(tpd.Month, '%Y-%m') <=", date($to_date)); 
$this->db->from('test_periodicity_details tpd'); 
$this->db->join('test t', 'tpd.Test_Id=t.Test_Id'); 
$this->db->join('school_information si', 't.School_Id=si.School_Id', 'left'); 
$this->db->join('test_status ss', 'tpd.Status=ss.Test_Status_Id', 'left'); 
echo $this->db->get_compiled_select(); 
$query = $this->db->get(); 
if ($query->num_rows() > 0){ 
    return $query->result(); 
} 
else { 
    return false; 
} 

回答

1

我已经解决了问题 -

$this->db->select('*', FAlSE); 
$this->db->where('t.Flag', '0'); 
$this->db->where('tpd.Status', $status); 
$this->db->where('tpd.Month>=', date($from_date)); 
$this->db->where('tpd.Month<=', date($to_date)); 
$this->db->from('test_periodicity_details tpd'); 
$this->db->join('test t', 'tpd.Test_Id=t.Test_Id'); 
$this->db->join('school_information si', 't.School_Id=si.School_Id', 'left'); 
$this->db->join('test_status ss', 'tpd.Status=ss.Test_Status_Id', 'left'); 
//echo $this->db->get_compiled_select(); 
$query = $this->db->get(); 
if ($query->num_rows() > 0){ 
    return $query->result(); 
} 
else { 
    return false; 
} 
0

由于date()返回一个字符串,不投月份值日期时间(与STR_TO_DATE())。 date()的第一个参数是要输出的格式字符串 - 第二个参数是实际时间戳记(日期)。所以date($from_date) == date('2016-12') == '2016-12'。如果您继续使用STR_TO_DATE(),那么您将拥有日期时间值和字符串值 - 而MySQL应该能够合并不需要的值。

可以使用BETWEEN运营商每月的日期范围比较:

$this->db->where('tpd.Month BETWEEN \''.$from_date .'\' AND \''.$to_date.'\''); 

否则只需更换这两个WHERE条件与要求:

$this->db->where('tpd.Month>=', $from_date); 
$this->db->where('tpd.Month<=', $to_date); 

你可以看到的结果更新的查询在this sqlfiddle。我在this site上也有一个使用PHP(但没有CodeIgniter)的例子。它正在运行与MySQLi functions等效的查询。