【问题标题】:codeigniter select records from date range without repeating a recordcodeigniter 从日期范围中选择记录而不重复记录
【发布时间】:2020-07-21 09:29:49
【问题描述】:

我正在处理一个需要以下查询但我无法完成的项目。

数据库:evenstdb

--------------------------------------
| Event_id | startDate |    endDate  |
--------------------------------------
|82637     |01-02-2020 |  02-03-2020 |
--------------------------------------
|66363     |10-03-2020 |  31-11-2020 |
--------------------------------------

我有一个页面,我应该根据所选日期范围列出事件。一切正常,但问题是有时我会两次列出相同的事件,因为我同时根据startDate 和endDate 列出事件。有时开始和结束日期在选定的日期范围内。如何只显示一次事件?

我的代码:

// $date1 and $date2 are date inputs from the form 

$query = $this->db->where('startDate >=', $date1);
$query = $this->db->where('startDate <=', $date2);
$query = $this->db->get('evenstdb');
$results1 =  $query->result();

$query = $this->db->where('endDate >=', $date1);
$query = $this->db->where('endDate <=', $date2);
$query = $this->db->get('evenstdb');
$results2 =  $query->result();

$data["eventsList"] = array_merge($results1,$results2);

【问题讨论】:

  • 为什么不在一个查询中写下这 4 个日期条件?
  • 我不确定语法,因为我对 codeigniter 很陌生,你能告诉我如何取悦吗?

标签: php mysql database codeigniter-3


【解决方案1】:

如果每条记录要同时匹配两个日期范围,您可以尝试通过一个查询同时满足所有 4 个条件来获取所需的记录:

$this->db->where('startDate >=', $date1)
         ->where('startDate <=', $date2)
         ->where('endDate >=', $date1)
         ->where('endDate <=', $date2);

$result = $this->db->get('evenstdb')->result();

如果每条记录至少匹配一个日期范围,您也可以尝试通过一次查询获取所需记录,但将条件分为与OR连接的两个部分(如果这两个组中的任何一个返回@987654323,则将返回记录@):

$this->db->group_start()
             ->where('startDate >=', $date1)
             ->where('startDate <=', $date2)
                 ->or_group_start()
                     ->where('endDate >=', $date1)
                     ->where('endDate <=', $date2)
                 ->group_end()
         ->group_end();

$result = $this->db->get('evenstdb')->result();

【讨论】:

    【解决方案2】:

    我最近需要一个查询来查找 MySQL 中的重叠日期范围。此解决方案的性能比上面的日期范围解决方案要好得多,而且效果很好。

    https://stackoverflow.com/a/62761904/11822079

    你也可以这样做:

    AND DATEDIFF(LEAST($date2, endDate),GREATEST($date1, startDate)) > 0;
    

    链接查询示例:

    SELECT o.orderStart, o.orderEnd, s.startDate, s.endDate
    , GREATEST(LEAST(orderEnd, endDate) - GREATEST(orderStart, startDate), 0)>0 as overlaps
    , DATEDIFF(LEAST(orderEnd, endDate), GREATEST(orderStart, startDate)) as overlap_length
    FROM orders o
    JOIN dates s USING (customerId)
    WHERE 1
    AND DATEDIFF(LEAST(orderEnd, endDate),GREATEST(orderStart, startDate)) > 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2013-03-23
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      相关资源
      最近更新 更多