Я сделал это несколькими способами. Во-первых, я предполагаю, что в вашей таблице указаны встречи, а теперь вы хотите получить список незарезервированного времени, верно?
Итак, первый способ, которым я это сделал, был как твой, просто хэш неиспользованных времен. Он медленный, ограниченный и немного расточительный, поскольку мне приходится пересчитывать хэш каждый раз, когда кому-то нужно знать, сколько времени доступно.
Следующий способ, которым я это сделал, - позаимствовать идею у людей из хранилища данных. Я создаю таблицу атрибутов для всех временных интервалов, которые меня интересуют. Если вы создаете такую таблицу, вы можете добавить туда больше информации, кроме времени интервалов. Вы также можете включить такие вещи, как выходные, какой час дня, будь то в обычные рабочие часы, будь то в отпуске, и тому подобное. Затем я должен объединить все слоты между временем начала и окончания, и мои назначения будут недействительными. Итак, это левое соединение, что-то вроде:
SELECT *
FROM slots
WHERE ...
LEFT JOIN appointments
WHERE appointments.id IS NULL
Это избавляет меня от необходимости каждый раз заново создавать хэш, и он использует базу данных для выполнения операций над множествами, что оптимизирует базу данных.
Кроме того, если вы сделаете свою таблицу слотов немного более насыщенной, вы можете начать выполнять все виды запросов не только о доступных слотах, которые вам нужны, но и о типах времени, которые обычно забронированы, или типах. времен, которые, как правило, всегда доступны, или другие интересные вопросы, на которые вы, возможно, захотите когда-нибудь ответить. По крайней мере, вы должны следить за полями, которые сообщают вам, должен ли слот быть заполненным или нет (например, в рабочее время).