2014-09-06 28 views
1

我正在体验一种挑战,我似乎无法控制自己的头脑,而不是在那里有任何经验。我有一些汽车修理/喷雾舱,我想知道有多少天没有使用。这里有一个简单的表格例子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读了,但是承认并不真正理解它,或者它或者mySQL。我的问题是我怎样才能得到第一个eDate和第二个sDate,第二个eDate和...等等之间的天数......我的脑袋开始流血并且感到疼痛,我期待着任何帮助......对不起,不是一个巨大的技术人员如此长的英语,如果可能的答案......这就是我lloking为:

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

你明显试图使用MySQL的,但如果你想获得以这些时间段的细节,你可以用[窗口功能]实现这一目标(HTTP:您可以使用相关子查询解答一下://www.postgresql.org/docs/current/static/functions-window.html)(例如本例中的LEAD或LAG)和支持它的RDBMS,如PostgreSQL或SQL Server。 – Bruno 2014-09-06 14:32:58

+0

这听起来像是一种解决方案,但它恐怕会在高空传递。我会考虑这一点,但希望这是有道理的。 – Filious 2014-09-06 14:35:56

+0

你的意思是'2014-09-30'而不是'2014-10-30' do availFor = 0吗?开始/结束之间也有问题。如果你只在2014-09-13和2014-09-17之间计算3天,这意味着在2014-09-30和2014-09-30之间应该有-1天(假设你的意思是)。 – Bruno 2014-09-06 14:44:54

回答

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; 
+0

感谢您的快速回复......我是否正确地说这只会给我'daysInUse'和daysNotIn'的总和?我正在寻找预订之间的个人日子,所以我可以告诉客户,在下一个客户出现之前,1天可以使用3天...我已经编辑了我的问题更清楚,但如果这是我的答案减免 – Filious 2014-09-06 14:36:19

+0

对不起,由于我的部分产生了混乱,但你刚刚提出的建议完美。我很感激。如果我有信贷投票给你,我会......享受你的一天戈登的其余部分。 – Filious 2014-09-06 14:51:01