【问题标题】:Mysql select dates that doesn't intersects with booked date rangesMysql选择不与预订日期范围相交的日期
【发布时间】:2026-02-16 21:45:01
【问题描述】:

我有一个日期表,每个日期代表一个任务,该任务需要三天才能完成。 我想选择所有未与另一个预订任务相交的未预订日期。 我已经尝试并在谷歌上搜索了三天,我认为是时候寻求帮助了。

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

【问题讨论】:

  • 您能详细说明您的预期结果集背后的逻辑吗?
  • “预订”日期是客户预订任务的日期。未预订的日期是要求的约会。我只想显示“未预订”的日期,并且不会碰巧在其中一个预订的约会中,因为每次约会都需要三天才能完成。

标签: mysql select date-range


【解决方案1】:

您可以使用左联接(通过在日期列中添加 3 天)在同一张表上为空来获取未预订的日期,并且不与其他任务的预订日期相交

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

【讨论】:

  • 谢谢你,在对你的小提琴做了一些改动后,这个解决了它,包括不与前后变量相交:[Fiddle Demo][1] - [1]:sqlfiddle.com/#!2/637ca9/29
【解决方案2】:

参考下面的答案。

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 的行。

【讨论】:

  • 非常感谢您的想法!