запросить бесплатные столики в ресторане с указанием часов на определенную c дату и в соответствии с рабочими сменами SQL - PullRequest
0 голосов
/ 21 февраля 2020

Структура таблиц следующая:

Tables:
Id  Number  Title
1   1       VIP-1
2   2       VIP-2

WorkShifts:
Id  DayOfWeek  From   To
1   Sunday     08:00  12:00
2   Sunday     17:00  20:00
3   Monday     18:00  23:00

Applications:
Id   CustomerId   TableId   Date        From   To
1    1            1         2020-02-23  08:00  09:30
2    3            2         2020-02-23  10:00  11:00

Имейте в виду, что минимальное резервное время составляет 1 час. Основываясь на информации выше, как запросить свободные таблицы (со временем) в конкретную c дату? например, в воскресенье 23 февраля 2020 года ('2020-02-23') результат должен быть:

TableId   Time
1         10:00
1         11:00
1         17:00
1         18:00
1         19:00
2         08:00
2         09:00
2         11:00
2         17:00
2         18:00
2         19:00

1 Ответ

0 голосов
/ 27 февраля 2020

После попытки разными способами, наконец, проблема решена с помощью этой хранимой процедуры:

create procedure GetFreeHourByTable @Date date as 

declare @startTime time(0), @endTime time(0), @day int

declare @dates table (day int, time time(0))

DECLARE cursor_shifts CURSOR
FOR SELECT 
        w.DayOfWeek, w.StartTime, w.EndTime 
    FROM 
        WorkingTimes w where w.DayOfWeek = DATEPART(dw, @Date) and w.IsDayOff = 0;

OPEN cursor_shifts;

FETCH NEXT FROM cursor_shifts INTO 
    @day,
    @startTime, 
    @endTime;

WHILE @@FETCH_STATUS = 0
    BEGIN
        while @startTime < DATEADD(HOUR, -1, @endTime)
        begin
            set @startTime = DATEADD(HOUR, 1, @startTime)

            insert into @dates values (@day, @startTime)
        end

        FETCH NEXT FROM cursor_shifts INTO 
        @day,
        @startTime, 
        @endTime;
    END;

CLOSE cursor_shifts;
DEALLOCATE cursor_shifts;

select t.*, d.* from @dates d, Tables t
where d.day =  DATEPART(dw, @Date) 
and not exists 
(select * from Applications a 
    where a.tableId = t.id and a.registerDate = @Date and d.time between a.startTime and a.endTime)

, поэтому мы можем запросить бесплатные таблицы (по дате) с часами:

exec GetFreeHourByTable @Date = '2020-02-23';
...