Dimgol
@Dimgol

Как исключить из промежутка дат?

Есть таблица Машина
(id)

Есть таблица (событие) где машина (id_car) забронирована c полями date_start (datetime) и date_end ( datetime)
например: id_car | 01.03.2019 14:40:00 | 01.03.2019 18:45:00

мне надо исключить чтоб не выводилась эта машина, если например выбрать 01.03.2019 13:40:00 до 01.03.2019 15:45:00 и.т.д

SELECT * FROM `car` WHERE (`status`='1')  
AND (`id` NOT IN (SELECT `id_car` AS `id` FROM `event`
 WHERE (`date_end`  > '01.03.2019 15:40:00')  AND (`date_start`  < '01.03.2019 18:30:00')))

но так не работает, машина все равно выводится, следовательно подзапрос не работает, почему ?

SELECT `id_car` AS `id` FROM `event`
 WHERE (`date_end`  > '01.03.2019 15:40:00') 
 AND (`date_start`  < '01.03.2019 18:30:00')
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
SELECT * 
FROM `car` 
WHERE `status` = '1' AND
    NOT EXISTS (
        SELECT 1 
        FROM `event` 
        WHERE `id_car` = `car`.`id` AND (
            '01.03.2019 15:40:00' BETWEEN `date_start` AND `date_end` OR
            '01.03.2019 18:30:00' BETWEEN `date_start` AND `date_end` OR
            ('01.03.2019 15:40:00' < `date_start` AND '01.03.2019 18:30:00' > `date_end`)
        )
    )
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
WHERE (`date_start`  >= '2019-03-01 14:40') 
 AND (`date_end`  <= '2019-03-01 18:45')


UPD:
итак, для начала - стандартный формат хранения datetime - Y-m-d H:i:s , то есть у вас СРАЗУ все не правильно будет работать.
далее, если вы используете запрос в таком виде как у меня описано - все работает.
Что бы перевести ваши кривые даты в нормальные для запроса либо пишите что-то типа
$startDate = date('Y-m-d H:i:s',strtotime('01.03.2019 15:40:00');
, либо вынесите это в хелпер или функцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы