我遇到了一个我似乎无法理解的挑战,而不是那里的任何经历都在那里嘎嘎作响。我有一些汽车维修/喷涂机架,我想知道有多少天没有使用。这是一个简单的表格示例shwoiung只有一个海湾,总共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,但承认并不是真的了解它或者我的SQL。我的问题是如何才能获得第一个eDate和第二个sDate之间的天数,第二个eDate和......等等......我的头疼和疼痛,我期待着给予任何帮助......对不起,不是一个庞大的技术人员,如果可能的话,请用长英语回答......这就是我喜欢的:
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
答案 0 :(得分:2)
如果未订购时间段,您可以通过计算总持续时间并减去使用时的持续时间来获得结果。这是一个例子:
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;