2016-12-10 157 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等效的查詢。