在Codeigniter/PHP中提取2个日期之间的事件时出现问题



我用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列具有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通常是非常明显的。

相关内容

  • 没有找到相关文章