我有一个带有日期值的用户表数据,当我想要通知是否有新日期并且新日期是在现有日期时我会有一个警告时,我有点困惑。如何解决这个问题
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
从上表中我将代表john start在2017/12/08添加一个新日期并在2017/12/10结束,因为2017/12/08的日期已经在2017/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>';
}
答案 0 :(得分:0)
你做什么不想要的是一个已经是另一个时间跨度的开始日期。
如果它位于另一个时间跨度内,则时间跨度的开始日期将小于或等于您的开始日期,结束日期将更大或等于equl。作为条件,它表示为:start <= date AND finish >= date
。
符合此条件的时间跨度将与您的新时间跨度重叠。
在您的尝试中使用MIN
和MAX
的问题是,您可能在时间跨度上存在差距,这将不会被视为那样。
您可以将此条件添加到SQL查询中。这可以通过使用您已经使用的Codeigniter query
方法来完成,这可以让您处理转义和所有其他内容,或者使用CodeIgniter QueryBuilder
方法,它将为您完成所有操作。< / p>
使用查询方法:
$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();
此条件仅在没有parantheses的情况下有效,因为AND
运算符比OR
运算符强,并且不存在其他where子句。如果你必须添加其他where子句,你需要在querybuilder中添加paranethsis。考虑一下,最后一个where
方法的结构与其余方法不同。因为您需要将结束括号添加到查询中,所以需要将其添加到右侧,因此添加到值侧。 querybuilder还是转义了第二个参数,因此也会转义结束括号。为了防止只能为where
方法提供一个参数,请包含转义值和结束括号。
$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>';
}