2017-12-12 24 views
0

私は、日付の値を持つユーザーテーブルデータを持っています。新しい日付と新しい日付がある場合に通知をしたいときにちょっと混乱します。既存の日付に警告が表示されます。例えば、上記の表から開始日と終了日の間に日付がある場合は無効になります。mysql

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 

この問題を解決するためにどのように日付12分の2017から、2017年12月10日に2017年12月8日と仕上げで開始私はジョンに代わって新しい日付が追加されます/ 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

は、すでに別の時間帯の一部である開始日です。 別のタイムスパンにある場合、タイムスパンの開始日は開始日よりも小さいか、終了日がより大きくなるか、またはequlになります。条件としては、start <= date AND finish >= dateと表されます。 この条件に一致する期間は、新しい期間と重複します。

MINMAXをあなたの試みで使用する際の問題は、そのようには考えられない時間間隔にギャップがある可能性があることです。

この条件をSQLクエリに追加できます。これは、すでに使用しているCodeigniter queryメソッドを使用するか、エスケープやその他すべての処理を処理するか、CodeIgniter QueryBuilderメソッドを使用することで実行できます。 querybuilder使用

$maxDate = $this->db->query('SELECT * FROM tb_user WHERE start <= "' . $row->start . '" AND finish >= "' . $row->start . '"'); 

:クエリーメソッドを使用して

タイムスパンは、あなたの行の終了日のために同じことを確認する必要があります重複していないことを確認するために

$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(); 

をaswell :

クエリメソッドの使用:

$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(); 

ANDオペレータはORオペレータより強く、他の場所条項が存在しないため、この条件のみ、括弧なしで動作します。他のwhere節を追加する必要がある場合は、クエリビルダでparanethsisを追加する必要があります。最後のwhereメソッドは、残りの構造とは別の構造を持っていると考えてください。クエリに閉じ括弧を追加する必要があるので、右に、したがって値の側に追加する必要があります。 querybuilderはまだ2番目のパラメータをエスケープしているため、閉じ括弧もエスケープします。 whereメソッドに1つのパラメータしか指定できないようにするには、エスケープされた値と閉じ括弧を含めます。

$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>'; 
} 
関連する問題