Sql-запрос за определенный период времени

#mysql #sql #mysqli

#mysql #sql

Вопрос:

Я пытаюсь написать запрос mysql с приведенными ниже деталями-

У меня есть три таблицы

1) Таблица бронирования со столбцом booking_id , journey_start_datetime , journey_end_datetime.

2) Таблица драйверов со столбцом driver_id драйвера, driver_name.

3) Таблица Driver_Assign со столбцом booking_id, driver_id, busy_start_datetime, busy_end_datetime.

Когда я назначаю бронирование водителю, новая запись переходит в таблицу Driver_Assign с подробными сведениями о booking_id , journey_start_datetime , journey_end_datetime.

Я хочу получить имена всех драйверов, которые не заняты в течение определенного времени. т.е.

Позволяет назначить одно бронирование водителю «John» для journey_start_datetime->’2014-06-27 12:00:00′ и journey_end_datetime->’2014-06-27 14:00:00′.

Теперь для нового бронирования (journey_start_datetime->’2014-06-27 13:00:00′ и journey_end_datetime->’2014-06-27 15:00:00′) водитель Джон не приедет.

Перемещение кода OP из комментария в вопрос —

 SELECT U.driver_name 
FROM driver AS U 
where U.id not in 
 (select driver_id 
  from driver_assign as DVA 
  WHERE ('2014-06-27 13:00:00'>= DVA.busy_start_datetime OR 
         '2014-06-27 13:00:00'<= DVA.busy_end_datetime
        ) AND 
        ('2014-06-27 15:00:00'>= DVA.busy_start_datetime OR 
         '2014-06-27 15:00:00'=< DVA.busy_end_datetime
        )
 )
 

Ответ №1:

 SELECT d.driver_name 
FROM driver d 
     LEFT JOIN driver_assign da ON da.driver_id=d.driver_id
WHERE
     da.busy_start_datetime <='2014-06-27 13:00:00'
    AND da.busy_end_datetime>='2014-06-27 13:00:00'
HAVING da.driver_id is null
 

Вам нужно просто соединить и исключить строки, которые не являются нулевыми (заняты)

Комментарии:

1. Будут ли busy_start_datetime и busy_end_datetime одинаковыми, т.е. «2014-06-27 13:00:00»?

2. Вы можете передать дату, необходимую для освобождения в обоих условиях

3. Извините, это не работает: ( У вас есть другой вариант? Пожалуйста, предложите.

Ответ №2:

 SELECT d.driver_name 
FROM driver d
WHERE d.driver_id not in
(SELECT driver_id from driver_assign  
    WHERE
(busy_start_datetime >= '2014-06-27 13:00:00' AND NOT busy_start_datetime >= '2014-06-27 15:00:00')  
    OR
(busy_end_datetime > '2014-06-27 13:00:00' AND NOT busy_end_datetime > '2014-06-27 15:00:00'
)
OR (busy_start_datetime < '2014-06-27 13:00:00' AND busy_end_datetime > '2014-06-27 15:00:00')
)
 

Комментарии:

1. На самом деле существует еще один ИЛИ, который необходимо будет добавить, где период в таблице driver_assign полностью содержится в пределах периода, который вы проверяете. Я отредактирую свой ответ.

2. Просто идея: вам действительно нужна таблица driver_assign? Вы могли бы просто поместить поле driver_id в таблицу бронирования.