Я бы рассмотрел для (1) использование формата, который включает время начала и окончания, а также целочисленное поле для дня недели. Я знаю, что вы заявили, что блоки будут всегда один час, но это может быть обеспечено вашим кодом. Кроме того, если ваши требования изменятся в один прекрасный день, на шаге (2) у вас будет намного меньше поводов для беспокойства, чем если бы все ваши операторы БД были записаны так, чтобы принимать блоки продолжительностью 1 час.
CREATE TABLE maintWindow (
maintWindowId int primary key auto_increment not null,
startTime Time,
endTime Time,
dayOfWeek int,
...
Для (2), если с каждой записью связано время начала и окончания, то очень легко проверить наличие окон для любого заданного времени:
SELECT maintWindowId
FROM maintWindow
WHERE $time >= TIME(startTime) AND $time <= TIME(endTime) AND DAYOFWEEK($time) = dayOfWeek
(где $time
представляет дату и время, которое вы хотите проверить).
Разрешение или запрет на каждый день недели будут обрабатываться отдельными записями. ИМХО, это более гибко, чем жесткое кодирование для каждого дня недели, так как тогда вы будете использовать какой-либо оператор case или переключение if-else для проверки нужного столбца DB для дня, который вас интересует.
Примечание: Убедитесь, что вы знаете, какой стандарт использует ваша БД для целого дня недели, и постарайтесь сделать свой код независимым от него (всегда спрашивайте БД). Нам было очень весело с разными стандартами для начала недели (воскресенье или понедельник) и стартового индекса (0 или 1).