Мне нужно Mysql Запрос для поиска доступных дат для выбранного месяца и года, исключая даты, взятые из таблицы - PullRequest
0 голосов
/ 19 марта 2020

Не могли бы вы помочь. Мне нужно показать доступные даты в диапазоне дат, взятых из таблицы

У меня есть таблица бронирования. Содержит mStartdate и дату окончания

Прочитайте таблицу и покажите все доступные даты, исключая даты, взятые из таблицы для выбранного месяца и года.

стол бронирования | Id | StartDate | EndDate | | 1 | 2020-03-05 | 2020-03-05 | | 2 | 2020-03-10 | 2020-03-11 | | 3 | 2020-03-12 | 2020-03-14 | | 3 | 2020-03-16 | 2020-03-18 |

Все, что мне нужно, это все доступные даты за месяц 03 ie Март. пример

2020-03-01 t0 2020-03-04 is available
2020-03-06 t0 2020-03-09 is available
2020-03-15 t0 2020-03-15 is available
2020-03-19 t0 2020-03-31 is available

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

2020-03-01
2020-03-02
2020-03-03
2020-03-04
2020-03-06
2020-03-07
2020-03-08
2020-03-09
2020-03-15
2020-03-19
to
2020-03-31

Спасибо, друзья. Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Вы можете использовать UNION для получения результата из двух столбцов. Я просто пишу запрос для одного столбца. Тот же метод применяется для другого столбца. Метид 1 Использование метода CAST() с подходом MySql BETWEEN

SELECT *
FROM tableName
WHERE StartDate BETWEEN CAST('2014-02-01' AS DATE) AND CAST('2014-02-28' AS DATE);

Метод 2 Использование метода CAST() без MySql BETWEEN подход

SELECT *
FROM tableName
WHERE StartDate >= CAST('2014-02-01' AS DATE)
AND StartDate <= CAST('2014-02-28' AS DATE);
0 голосов
/ 19 марта 2020

В MySQL 8.0 вы можете использовать рекурсивное общее табличное выражение для генерации списка дат месяца, а затем отфильтровать его по диапазонам дат, определенным в таблице:

with recursive cte as (
    select '2020-03-01' dt
    union all select dt + interval 1 day 
    from cte
    where dt + interval 1 day < '2020-04-01'
)
select dt
from cte c
where not exists (select 1 from mytable t where c.dt between t.start_date and t.end_date)
order by dt

В более ранних версиях одно решение включает таблицу чисел; вот решение с производной таблицей

select '2020-03-01' + interval x.n day dt
from (select 0 n union all select 2 ... union all select 30) x
where not exists (
    select 1
    from mytable t
    where '2020-03-01' + interval x.n day between t.start_date and t.end_date
)
order by dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...