Как найти диапазон start_time и end_time, если он находится в диапазоне, проверьте start_date и end_date

У меня есть таблица ниже в базе данных.

    id | list_id |venue_id |name | start_date | end_date   |start_time | end_time 
    1  |       1 |  1      |asdf |  2019-02-02| 2019-02-28 |05:30      |10:00
    2  |       7 |  2      |awed |  2019-02-10| 2019-02-20 |07:30      |14:00
    3  |       7 |  1      |mjgd |  2019-02-04| 2019-02-13 |09:30      |18:00

Теперь мне нужно найти начальную_дату и конечную_дату venue_id=1 между диапазоном от 2019-02-04 до 2019-03-01. Поэтому я использовал запрос ниже.

SELECT * FROM `batch_list` WHERE `venue_id` = 1 and ((start_date between '2019-02-04' and '2019-03-01') OR (end_date between '2019-02-04' and '2019-03-01'))

Теперь мне нужно найти дату и время для location_id = 1, которые находятся в диапазоне от 2019-02-04 и 2019-03-01 и от 05:00 до 18:00. Итак, я попробовал под запросом

SELECT * FROM `batch_list` WHERE `venue_id` = 1 and ((start_date between '2019-02-04' and '2019-03-01') OR (end_date between '2019-02-04' and '2019-03-01')) and((start_time <= `end_time`) and (`start_time` between '05:00' and '18:00')and (end_time between '05:00' and '18:00'))

Так что до сих пор нет никаких проблем.

У меня есть время, которое составляет от 05:00 до 20:00, тогда я получаю все записи, связанные с местом проведения_идентификатора 1, но если я изменю время 10:00 на 13:00, тогда я не получаю записи.

Мне нужно узнать, есть ли в диапазоне start_time и end_time или нет. Если найдено, проверьте start_date и end_date.

Не могли бы вы помочь мне в этом вопросе?

Модель

function fetchBatches($venue_id,$new_batch_start_date,$new_batch_end_date,$new_batch_start_time,$new_batch_end_time)
    {
$where="batch_venue_id='$venue_id' and ((start_date between '$new_batch_start_date' and '$new_batch_end_date')OR (end_date between '$new_batch_start_date' and '$new_batch_end_date')) and ((start_time<=end_time) and (start_time < '$new_batch_start_time' and start_time < '$new_batch_end_time'))";

        $result =$this->db->select('*')    
                    ->from('batch_list')
                    ->where($where)
                    ->get()
                    ->result();
            if ($result) {
                 return $result;
            }
            else{
                 return 0;
            }

    }

person user9437856    schedule 01.02.2019    source источник
comment
Ой! Мне этого не хватает. Подождите, я обновляю вопрос. То есть с 10:00 до 13:00. Обновленный вопрос.   -  person user9437856    schedule 01.02.2019
comment
Вы можете избавить себя от боли, сохранив дату и время как единое целое.   -  person Strawberry    schedule 01.02.2019
comment
Я не понимаю - вы действительно хотите найти перекрытие двух временных интервалов?   -  person splash58    schedule 01.02.2019
comment
@ splash58, у меня записи уже в таблице. Если администратор снова захочет создать записи location_id = 1, сначала он проверит, доступны ли start_time и end_time в записях, если записи доступны, затем он проверит даты.   -  person user9437856    schedule 01.02.2019
comment
@ splash58, Моя основная цель - админ не может создавать никаких записей, если найден какой-либо диапазон времени и дат. например: location_id = 1 зарезервировано на дату с 02.02.2019 по 28.02.2019 и время с 05:30 до 10:30. Если администратор попытается создать какие-либо записи с одним и тем же идентификатором, он проверит время и дату.   -  person user9437856    schedule 01.02.2019
comment
Да, вы хотите убедиться, что ваш временной интервал не перекрывается ни с одним в db. Есть много таких вопросов по SO   -  person splash58    schedule 01.02.2019
comment
Не разделяйте дату и время - у вас должен быть вопрос - площадка_id = 1 зарезервирована на дату с 2019-02-02 05:30 по 2019-02-28 10:30.   -  person splash58    schedule 01.02.2019
comment
@ splash58, да, проверял на ТАК, но пока только проверяю время. Мой сенарио, если нашел время, также проверьте дату   -  person user9437856    schedule 01.02.2019
comment
@ splash58, у меня есть поле, где админ может ввести start_time и end_time.   -  person user9437856    schedule 01.02.2019
comment
К сожалению, вы сохраняете не поле DateTime, и вам нужно будет сделать это с помощью функций mysql.   -  person splash58    schedule 01.02.2019
comment
Давайте продолжим это обсуждение в чате.   -  person user9437856    schedule 01.02.2019


Ответы (1)


Как предлагали некоторые, лучше комбинировать дату и время в базе данных.

Что касается вашего вопроса, я думаю, что вам нужен следующий запрос:

SELECT * FROM batch_list 
WHERE    venue_id = 1
         AND (start_date <= '2019-03-01') 
         AND (start_time <= '13:00:00')
         AND (end_date >= '2019-02-04')
         AND (end_time >= '10:00:00')
person Dialex    schedule 01.02.2019
comment
Спасибо за ответ. Дай мне время проверить - person user9437856; 01.02.2019
comment
Обновил мой ответ, попробуйте еще раз и сообщите мне, если он по-прежнему не работает - person Dialex; 05.02.2019
comment
Дай мне попробовать снова. - person user9437856; 05.02.2019
comment
2019-03-01 - дата окончания, а 13:00:00 - время окончания ... правильно? - person user9437856; 05.02.2019
comment
Да, именно так, он проверяет наличие бронирования между 10:00 04.02.2019 и 13:00 03.01.2019. - person Dialex; 05.02.2019
comment
У меня есть небольшая озабоченность. Если location_id несколько, как я могу это проверить? Я имею в виду, например, meeting_id = 1,2 - person user9437856; 05.02.2019
comment
Это не проблема, вы можете добавить еще одно условие для места проведения, например WHERE (venue_id = 1 OR venue_id = 2) AND ... - person Dialex; 05.02.2019
comment
через несколько дней я меняю таблицу и идентификатор места встречи, я имею в виду, что теперь я получаю идентификатор места в столбце, например 1,3,4 .... Я получаю сообщение об ошибке неизвестно в столбце «1,3,4», где пункт'. я должен использовать для этого функцию взрыва? - person user9437856; 05.02.2019
comment
Я не понимаю. Изменили ли вы структуру таблицы, и в месте проведения мероприятия хранится более одного идентификатора? - person Dialex; 05.02.2019
comment
Давайте продолжим это обсуждение в чате. - person Dialex; 05.02.2019
comment
У меня такая же проблема. Я использую ваш ответ, но на этот раз мне нужно проверить дни. Можете ли вы помочь мне в этом вопросе stackoverflow.com/questions/54721274/ - person user9437856; 17.02.2019
comment
Я изо всех сил пытаюсь найти эту проблему за последние 8-9 дней .. Пожалуйста, помогите мне в этом вопросе ... пожалуйста, пожалуйста - person user9437856; 17.02.2019