私はCodeigniterを使用してレンタカーシステムに取り組んでいますが、車両には複数の使用不可能な日付範囲がある場合があります。利用できない日付範囲のための別のテーブルを作成しました。ユーザーは日付範囲を入力し、その自動車の利用不可能な日付範囲と重複しないすべての車を選択します。以下は私のコードです。MySQLは、日付範囲が他の日付範囲と重複していないかどうかを確認しますか?
$d1 = date('Y-m-d', strtotime($pickup));
$d2 = date('Y-m-d', strtotime($dropoff));
// $this->db->where($d1." NOT BETWEEN date_ranges.start_date AND date_ranges.end_date AND " . $d2.' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date');
$this->db->where("'$d1' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date AND '$d2' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date OR ('$d1' < date_ranges.start_date AND '$d2' > date_ranges.end_date) ");
// $this->db->where(" '$d1' <= date_ranges.end_date AND date_ranges.start_date <= '$d2'");
$query = ->join('date_ranges', 'vehicles.id = date_ranges.vehicle_id', 'left')
->group_by('vehicles.id')
->get('vehicles');
生のクエリ
SELECT `vehicles`.`id`, `vehicles`.`year-`, `vehicles`.`model`,
`vehicles`.`nightly_rate`, `vehicles`.`class`,
`vehicle_pictures`.`picture`,
`vehicles`.`people` FROM `vehicles` LEFT JOIN `vehicle_pictures` ON
`vehicles`.`id` = `vehicle_pictures`.`vehicle_id` LEFT JOIN `date_ranges`
ON
`vehicles`.`id` = `date_ranges`.`vehicle_id`
WHERE (`country` LIKE '%%'
ESCAPE
'!' OR `state` LIKE '%%' ESCAPE '!' OR `city` LIKE '%%' ESCAPE '!' OR
`street`
LIKE '%%' ESCAPE '!' OR `zip` LIKE '%%' ESCAPE '!')
AND '2017-05-23'
NOT
BETWEEN `date_ranges`.`start_date` AND date_ranges.end_date AND '2017-
05-24'
NOT
BETWEEN `date_ranges`.`start_date` AND date_ranges.end_date OR ('2017-
05-23' <
`date_ranges`.`start_date` AND '2017-05-24' > date_ranges.end_date) AND
`vehicles`.`people` > '1' GROUP BY `vehicles`.`id`;
(https://stackoverflow.com/questions/2545947/check-overlap-of-date-ranges-in-mysql)[MySQLで日付範囲の重複をチェック] – JazZ