以下のデータがある。
select * from reservations;
+----------+------------+------------+
| reserver | start_date | end_date |
+----------+------------+------------+
| 内田 | 2006-11-03 | 2006-11-05 |
| 堀 | 2006-10-31 | 2006-11-01 |
| 山本 | 2006-11-03 | 2006-11-04 |
| 木村 | 2006-10-26 | 2006-10-27 |
| 水谷 | 2006-11-06 | 2006-11-06 |
| 荒木 | 2006-10-28 | 2006-10-31 |
+----------+------------+------------+
宿泊期間が重複しているレコードを抽出する。
select
*
from
reservations r1
where
exists (
select
'X'
from
reservations r2
where
r1.reserver <> r2.reserver
and (r1.start_date between r2.start_date and r2.end_date -- 開始日が他の期間内にある
or r1.end_date between r2.start_date and r2.end_date -- 終了日が他の期間内にある
)
and (r2.start_date between r1.start_date and r1.end_date -- 開始日が他の期間内にある
or r2.end_date between r1.start_date and r1.end_date -- 終了日が他の期間内にある
)
)
+----------+------------+------------+
| reserver | start_date | end_date |
+----------+------------+------------+
| 内田 | 2006-11-03 | 2006-11-05 |
| 堀 | 2006-10-31 | 2006-11-01 |
| 山本 | 2006-11-03 | 2006-11-04 |
| 荒木 | 2006-10-28 | 2006-10-31 |
+----------+------------+------------+
こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ