【发布时间】:2019-04-08 12:40:58
【问题描述】:
试图找出每天在两个时间戳之间预订资源的总时间 - 比如说 08:00 - 16:00。
到目前为止,我想出了这个解决方案,但它没有按预期工作。我知道它为什么不工作,但我不确定我如何从这里得到一个工作 SQL。
SELECT bookingresource.resourceID, SEC_TO_TIME(SUM(TIME_TO_SEC(booking.bookingEndDatetime) - TIME_TO_SEC(booking.bookingStartDatetime))) AS totalTimeBooked
FROM booking, bookingresource
WHERE booking.bookingID = bookingresource.bookingID
AND bookingresource.bookingStartDatetime BETWEEN '2019-03-11 00:00:00' AND '2019-03-11 23:59:59'
AND HOUR(bookingresource.bookingStartDatetime) BETWEEN 8 AND 16
AND HOUR(bookingresource.bookingEndDatetime) BETWEEN 8 AND 16
AND booking.companyID = 2447 AND bookingresource.`resourceID` = 807
GROUP BY bookingresource.resourceID
通过这种方式,我不包括在 8-16 之外开始或结束的预订,这是不打算的。如何将部分预订时间在 08:00-16:00 之间的预订包括在内,并且仅计算 08:00-16:00 之间的预订时间。
编辑:我将尝试稍微简化 SQL,因此没有太多不必要的代码。我现在的问题是计算总时间的方式。目前,如果预订部分在时间范围内,它将包括时间范围之外的时间。
SELECT bookingresource.resourceID, SEC_TO_TIME(SUM(TIME_TO_SEC(booking.bookingEndDatetime) - TIME_TO_SEC(booking.bookingStartDatetime))) AS timediff FROM booking, bookingresource
WHERE booking.bookingID = bookingresource.bookingID
AND (HOUR(bookingresource.bookingStartDatetime) BETWEEN 8 AND 16
OR HOUR(bookingresource.bookingEndDatetime) BETWEEN 8 AND 16)
GROUP BY bookingresource.resourceID
编辑 2:所以我找到了一个解决方案,但我遇到了超过一天的预订问题。到目前为止,这是我的解决方案:
SELECT bookingresource.resourceID, SEC_TO_TIME(sum(LEAST(TIME_TO_SEC(TIME(booking.bookingEndDatetime)), TIME_TO_SEC('16:00')) - GREATEST(TIME_TO_SEC(TIME(booking.bookingStartDatetime)), TIME_TO_SEC('08:00')))) AS totalTimeBooked FROM booking, bookingresource
WHERE booking.bookingID = bookingresource.bookingID
AND bookingresource.bookingStartDatetime BETWEEN '2019-04-10 00:00:00' AND '2019-04-10 23:59:59'
AND (TIME(bookingresource.bookingStartDatetime) BETWEEN '08:00' AND '16:00'
OR TIME(bookingresource.bookingEndDatetime) BETWEEN '08:00' AND '16:00')
AND bookingresource.`resourceID` = 453
group by bookingresource.resourceID
【问题讨论】:
-
... AND (HOUR BETWEEN OR HOUR BETWEEN)。在您的时间范围内开始或结束。 -
谢谢,但这只会解决我的收录问题,但不会解决资源在时间范围内的预订小时数。
-
使用
MAX和MIN计算您的“有限”开始和结束时间。 -
我不确定你的意思。你会怎么做呢?