2014-09-04 167 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 

这正是您所需要的索引范围扫描。

相关问题