2014-09-04 213 views
0

我在Codeigniter中製作了一個包含事件的日曆,所以我想按照月份和年份建立這些事件的列表。從數據庫中選擇月份和年份的日期

在數據庫中,我有事件列表,我想通過字段日期檢索,它使用DATE數據類型。

if($year != null and $month != null) 
    { 
     $this->db->where('date', '?'); 
    } 
    $events = $this->db->get('agenda')->result(); 

基本上我有一個YYYY-MM用YYYY-MM-DD比較。

謝謝你,對不起我的英文。

+0

你的問題不清楚,對不起。你想要檢索的行數範圍是多少?看起來你想在他們檢索它們之後按年份和月份排列它們。是對的嗎? – 2014-09-04 19:32:05

+0

我想檢索用戶選擇的月份和年份的所有事件。但是在日期字段中日期的格式爲yyyy-mm-dd。我只有yyyy-mm信息。 – 2014-09-04 19:34:43

回答

1

假設$this->db->where()使得AND field = value嘗試。

$this->db->where("DATE_FORMAT(date,'%d')", $month); 
$this->db->where("DATE_FORMAT(date,'%Y')", $year); 

DATE_FORMAT()功能是操作/格式化日期的MYSQL功能,所以這應該等同於

WHERE 
    DATE_FORMAT(date,'%d') = '12' 
AND DATE_FORMAT(date,'%Y') = '2014' 

或者你可以使用

$this->db->where('MONTH(date)', $month); 
$this->db->where('YEAR(date)', $year); 
+0

Yeaaah!萬分感謝! – 2014-09-04 19:55:42

+1

請注意,這個正確的解決方案無法使用索引來搜索「日期」列。所以可能表現不盡如人意。 – 2014-09-04 20:08:36

-1

該查詢應解決您的問題!

SELECT * FROM table_name WHERE data_field_name >='01/10/2000' 

SELECT * FROM table_name WHERE data_field_name between '01/01/2009' and '01/01/2010'; //FOR YEAR 

SELECT * FROM table_name WHERE data_field_name between '01/01/2009' and '01/02/2009'; //FOR MONTH 
+0

是的,它應該但我沒有yyy​​y/mm/dd信息。只是yyyy-mm。 – 2014-09-04 19:43:11

+0

但是對於整個月你只需要從第1天開始到最後一天=)。你也可以date()PHP函數,給你今天的日期,就像這樣:echo date('Y/m/d') – brunoroc 2014-09-04 19:49:09

+0

這是MYSQL。日期字符串是'yyyy-mm-dd' – 2014-09-04 20:05:44

0

在MySQL查詢應該是這樣的

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' //Y-m-d 

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' AND data_field_name <='2014-10-1' 

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' 

SELECT * FROM table_name WHERE data_field_name BETWEEN '2000-10-1' AND '2014-10-1' 

你可以做到這一點也

SELECT * FROM table_name WHERE YEAR(data_field_name) >= '2010' AND MONTH(data_field_name) >='10' AND DAY(data_field_name) >= '1' 

等....

你使用情況下,我會做這樣的事情

SELECT 
    *, MONTH(date_field) as month 
FROM 
    table_name 
WHERE 
    something = '1' 
ORDER BY 
    month 
0

,最好的辦法做,這是因爲如下:

$monthstring = sprintf('%d-%d-01', $year, $month); /* make yyyy-mm-01 string */ 
$this->db->where ("date >= '$monthstring'"); 
$this->db->where ("date < '$monthstring' + INTERVAL 1 MONTH"); 

這是一個很好的方法,因爲如果碰巧有索引可用於搜索date列,

它擴大到這種MySQL的where子句

WHERE date >= '2014-07-01' AND date < '2014-07-01' + INTERVAL 1 MONTH 

這正是您所需要的索引範圍掃描。

相關問題