我创建了一个带有codeigniters日历类的活动日历,您可以在此处查看:Events Calendar
我设置了事件在日历上显示的位置以及点击"查看事件"在某一天,具有该开始日期的所有事件都会上拉并显示在模态窗口中。
嗯......问题在于,除非是特定事件的开始日期,否则模态窗口的详细信息不会拉高。我知道这是因为我在我的查询中说拉开始日期等于特定日期的事件......
我有点难以理解如何修改它,"拉出所有记录,这一天在事件的开始和结束日期之间的任何地方。
我是否需要运行while循环或其他内容并循环遍历每月的每一天?任何有关更简单方法的想法都会受到赞赏。
开始日期和结束日期设置为' Y-m-d H:i:s'在数据库中传入的$ query_date变量是' Y-m-d',我在函数的前几行中更改为相同的格式。
function get_list_events($query_date) {
$start_date_start = date('Y-m-d H:i:s', strtotime($query_date.' 00:00:00'));
$start_date_end = date('Y-m-d H:i:s', strtotime($query_date.' 23:59:59'));
$this->db->where('active', 1);
$this->db->where("start_date BETWEEN '$start_date_start%' AND '$start_date_end%'", NULL, FALSE);
$query = $this->db->get('events');
$data = array();
foreach ($query->result() as $row) {
$data[] = array(
'id' => $row->id,
'title' => $row->title,
'description' => $row->description,
'cost' => $row->cost,
'image' => $row->image,
'start_date' => $row->start_date,
'end_date' => $row->end_date,
'venue' => $row->venue,
'venue_address' => $row->venue_address,
'venue_city' => $row->venue_city,
'venue_state' => $row->venue_state,
'venue_zipcode' => $row->venue_zipcode,
'contact_name' => $row->contact_name,
'contact_email' => $row->contact_email,
'contact_phone' => $row->contact_phone,
'contact_website' => $row->contact_website,
'create_date' => $row->create_date,
'active' => $row->active,
);
}
return $data;
}
答案 0 :(得分:0)
我猜您的start_date
列包含DATETIME
或TIMESTAMP
数据类型。如果不是这样,请更新您的问题。
在各种SQL的日期范围处理中都存在一个常见的陷阱,因为当你将纯DATE
与DATETIME
进行比较时,它们几乎不会相等。这是因为,例如,DATE('2011-07-1')与2011-07-01 00:00:00
的含义相同。
所以你需要
start_date >= '$start_date_start'
AND start_date < '$start_date_end' + INTERVAL 1 DAY
而不是你拥有的,
start_date BETWEEN '$start_date_start%' AND '$start_date_end%' /*wrong!*/
< ... + INTERVAL 1 DAY
的第二个句子会在你的间隔的最后一天收集所有可能的时间。
修改既然您已经披露了有两个DATETIME
列,名为start_date
和end_date
,那就好像您正在寻找物品在特定日期或之前开始,并在同一日期或之后结束。尝试这样的事情:
WHERE DATE(start_date) <= DATE('$specific_date')
AND DATE(end_date) >= DATE('$specific_date')
这样的查询技巧是花费大部分时间来思考并指定所需的结果。如果这样做,SQL通常是非常明显的。