不同行上两个列值之间的天数

时间:2014-09-06 14:15:44

标签: mysql

我遇到了一个我似乎无法理解的挑战,而不是那里的任何经历都在那里嘎嘎作响。我有一些汽车维修/喷涂机架,我想知道有多少天没有使用。这是一个简单的表格示例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

1 个答案:

答案 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;