我正在经历一个挑战,我似乎无法左右我的头,而不是有任何经验在那里喋喋不休。我有一些汽车修理/喷漆间,我想知道有多少天不用。这是一个简单的表格示例,总共20个隔间中只有一个隔间。我总是一次只查询一个间隔,除非有一种聪明的方法可以执行多个间隔:

bayID |   sDate    |   eDate
------+------------+------------
1     | 2014-09-06 | 2014-09-13
1     | 2014-09-17 | 2014-09-21
1     | 2014-09-27 | 2014-09-30
1     | 2014-10-30 | 2014-10-13

我一直在阅读最新的Datediff,但我承认我并不真正了解它或mySQL的内部和外部。我的问题是我怎样才能得到从第一个星期日到第二个星期日,第二个星期日和。。。等等。。。看着我的头和流感疼痛我期待着任何帮助。。。抱歉,不是很专业,所以如果可能的话用长英语回答。。。这就是我允许的:
bayID |   sDate    |   eDate     availFor
------+------------+------------+---------
1     | 2014-09-06 | 2014-09-13      3
1     | 2014-09-17 | 2014-09-21      5
1     | 2014-09-27 | 2014-09-30      0
1     | 2014-10-30 | 2014-10-13

最佳答案

如果时间段没有排序,则可以通过计算总持续时间并在使用时减去持续时间来获得结果。下面是一个例子:

select bayid,
       min(sdate) as firstsdate, max(edate) as lastedate,
       sum(datediff(edate, sdate)) as daysinuse,
       datediff(max(edate), min(sdate)) - sum(datediff(edate, sdate)) as DaysNotInUse
from bays b
group by bayId;

这将为您提供从使用间隔的第一天到最后一天之间未使用的天数。
编辑:
这是一个完全不同的问题。您可以用相关子查询来回答它:
select b.*,
       datediff((select min(sdate)
                 from bays b2
                 where b2.bayId = b.bayId and b2.sdate >= b.edate
                ), edate) - 1 as DaysFreeBetweenBookings
from bays b;

10-07 18:08