Как узнать общее забронированное время между 08: 00-16: 00 на ресурсе - PullRequest
1 голос
/ 08 апреля 2019

Попытка найти общее время, за которое ресурс резервируется между двумя временными метками в день - скажем, 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

1 Ответ

0 голосов
/ 08 апреля 2019

Попробуйте преобразовать строковую дату в правильное значение datetime

, и если вы не хотите, чтобы значения выходили за пределы диапазона 8–16, вам также следует проверить, что дата для звездочки и конца совпадает

  SELECT bookingresource.resourceID
    , SEC_TO_TIME(SUM(TIME_TO_SEC(booking.bookingEndDatetime) - TIME_TO_SEC(booking.bookingStartDatetime))) AS totalTimeBooked 
  FROM booking
  INNER JOIN  bookingresource  ON booking.bookingID =  bookingresource.bookingID
  WHERE  bookingresource.bookingStartDatetime BETWEEN str_to_date('2019-03-11 00:80:00', '%Y-%m-%d %T') 
        AND str_to_date('2019-03-11 23:59:59', '%Y-%m-%d %T') 
  AND HOUR(bookingresource.bookingStartDatetime) BETWEEN 8 AND 16 
  AND HOUR(bookingresource.bookingEndDatetime) BETWEEN 8 AND 16
  AND DATE(bookingresource.bookingStartDatetime) = DATE(bookingresource.bookingEndDatetime)
  AND booking.companyID = 2447 
  AND bookingresource.`resourceID` = 807
  GROUP BY bookingresource.resourceID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...