我用codeigners日历类创建了一个事件日历,您可以在这里查看:事件日历
我已经设置好了事件在日历上显示的位置,当你在某一天点击"查看事件"时,所有开始日期的事件都会出现并显示在模式窗口中。
嗯。。。问题是,除非是特定事件的开始日期,否则模式窗口的详细信息不会出现。我知道这是因为我在查询中说,要提取开始日期等于某个日期的事件。。。
我有点困惑于如何修改它,说:"把今天的所有记录都拉到事件开始和结束日期之间的任何地方。"
我需要在一个月的每一天运行一个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;
}
我猜您的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通常是非常明显的。