我的用户表数据带有一个日期值,如果有新日期,我想发出通知时有点困惑将发出警告。如何解决这个问题
tb_user
+----+--------+------------+------------+
| id | user | Start | Finish |
+----+--------+------------+------------+
| 1 | John | 2017-12-05 | 2014-12-06 |
| 2 | John | 2017-12-07 | 2014-12-09 |
| 3 | Smith | 2017-12-03 | 2014-12-06 |
| 4 | Smith | 2017-12-07 | 2014-12-10 |
+----+--------+------------+------------+
new value john = start 2017-12-08 and finish 2017-1210
例如,在上表中,我将在2017/12/08的John Start上添加新日期,并在2017/12/10完成,因为日期2017/12/08已经在2017/12/12/之间07-2017/12/09然后,我无法通过显示标题来添加数据。我进行了查询,但有点不确定如何解决?
$maxDate = $this->db->query('select max(start) as maxD, min(finish) as minD from tb_user where user = "'.$row->user.'" ');
$maxDate = $maxDate->row_array();
if($row->start < $maxDate['maxD'] ){
echo '<label class="text-danger">booking</label>';
}else{
echo '<label class="text-success">empty</label>';
}
您所做的不是 Want是一个开始日期,已经是另一个时间跨度的一部分。如果它在另一个时间范围内放置,则时间跨度的开始日期将较小或等于您的开始日期,并且完成日期将更大或EQUL。作为条件,它表示为:start <= date AND finish >= date
。匹配此条件的时间跨度将与您的新时间跨度重叠。
与MIN
和MAX
合作的问题是,您可能在时间跨度上存在差距,这不会以这种方式考虑。
您可以将此条件添加到SQL查询中。这可以使用您已经使用的Codigniter query
方法来完成,该方法使您可以处理逃逸和所有其他内容,也可以使用Codeigniter QueryBuilder
方法来完成。
使用查询方法:
$maxDate = $this->db->query('SELECT * FROM tb_user WHERE start <= "' . $row->start . '" AND finish >= "' . $row->start . '"');
使用QueryBuilder:
$this->db->select(); // Giving no parameter is equal to SELECT *
$this->db->from('tb_user');
$this->db->where('start <=', $row->start); // $this->db->where('fieldname operator', value);
$this->db->where('finish >=', $row->start); // If you do not add an operator to the first parameter the operator will be = by default
$maxDate = $this->db->get();
为了确保时间跨度不重叠,您应该检查行的饰面日期相同的时间:
使用查询方法:
$maxDate = $this->db->query('SELECT * FROM tb_user WHERE ( start <= "' . $row->start . '" AND finish >= "' . $row->start . '" ) OR ( start <= "' . $row->finish . '"AND finish >= "' . $row->finish . '" )');
使用QueryBuilder:
$this->db->select(*);
$this->db->from('tb_user');
$this->db->where('start <=', $row->start);
$this->db->where('finish >=', $row->start);
$this->db->or_where('start <=', $row->finish);
$this->db->where('finish >=', $row->finish);
$maxDate = $this->db->get();
这种情况只能在没有paranthes的情况下起作用,因为AND
操作员比OR
操作员强,并且没有其他段落。如果您必须添加其他示例,则需要在QueryBuilder中添加Paranethsis。考虑到最后一个where
方法具有另一个结构,而不是其余的结构。因为您需要将关闭括号预先到查询中,因此需要将其添加到右侧,从而将其添加到值侧。QueryBuilder却逃脱了第二个参数,因此将逃脱关闭的括号。为了防止仅给where
方法提供一个参数,请控制ESCAPATE值和关闭括号。
$this->db->select(*);
$this->db->from('tb_user');
$this->db->where('(start <=', $row->start);
$this->db->where('finish >= ', $row->start);
$this->db->or_where('start <=', $row->finish);
$this->db->where('finish >= "' . $row->finish . '")');
$maxDate = $this->db->get();
查询将返回所有碰撞的行,因此,只有此查询的结果为空,才能添加新的日期。可以使用num_rows
方法检查。
if ($maxDate->num_rows() > 0) {
echo '<label class="text-danger">booking</label>';
} else {
echo '<label class="text-success">empty</label>';
}