我有一个日期表,每个日期代表一个任务,任务需要三天才能完成。 我想选择与其他预订任务不相交的所有未预订日期。 我现在已经尝试和谷歌搜索了三天,我认为是时候寻求帮助了。
date booked
=========== =======
2014-09-01 0
2014-09-02 1
2014-09-05 0
2014-09-10 1
2014-09-15 0
2014-09-16 0
2014-09-20 1
2014-09-25 0
预期结果:
date booked
=========== =======
2014-09-01 0
2014-09-15 0
2014-09-16 0
2014-09-25 0
答案 0 :(得分:1)
请参阅以下答案。
Detect overlapping date ranges from the same table
如果您可以将日期更改为Start_Date并添加End_Date列(Start_Date + 3),则在引用的答案中添加NOT将导致您的答案没有重叠的日期范围。
select dr1.* from date_ranges dr1
inner join date_ranges dr2
where NOT (dr2.start > dr1.start -- start after dr1 is started
and dr2.start < dr1.end) -- start before dr1 is finished
从上述查询的结果中,您可以选择预订列为0的行。
答案 1 :(得分:1)
您可以使用左连接(在日期列中添加3天),在同一个表上使用null以获取未预订的日期,并且不与其他任务的预订日期相交
select t.*,
t1.date date1
from t
left join t t1 on(t.date = t1.date + interval 3 day)
where t.booked = 0 and t1.date is null
Fiddle Demo