无法在Codeigniter / PHP中的两个日期之间拉取事件

时间:2014-04-10 14:22:14

标签: php mysql codeigniter datetime activerecord

我创建了一个带有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;

    }

1 个答案:

答案 0 :(得分:0)

我猜您的start_date列包含DATETIMETIMESTAMP数据类型。如果不是这样,请更新您的问题。

在各种SQL的日期范围处理中都存在一个常见的陷阱,因为当你将纯DATEDATETIME进行比较时,它们几乎不会相等。这是因为,例如,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_dateend_date,那就好像您正在寻找物品在特定日期或之前开始,并在同一日期或之后结束。尝试这样的事情:

 WHERE DATE(start_date) <= DATE('$specific_date')
   AND DATE(end_date) >= DATE('$specific_date')

这样的查询技巧是花费大部分时间来思考并指定所需的结果。如果这样做,SQL通常是非常明显的。