Как рассчитать блоки свободного времени, используя время начала и окончания? - PullRequest
0 голосов
/ 25 марта 2011

У меня есть приложение Ruby on Rails, которое использует MySQL, и мне нужно вычислить блоки свободного (доступного) времени по таблице, в которой есть строки времени начала и окончания. Это должно быть сделано для диапазона дат, поэтому, например, мне нужно будет узнать, какие времена свободны в период с 1 по 7 мая. Я могу запросить в таблице время, которое недоступно, и использовать его для удаления периодов. времени между 1 мая и 7 мая. Время в базе данных хранится с точностью до 15 минут в четверть часа, что означает, что все времена заканчиваются в 00, 15, 30 или 45 минут. Никогда не бывает времени, подобного 11:16 или 10:01, поэтому округление не требуется.

Я думал о создании хэша со временем, представленным с шагом 15 минут, и обнулении всех значений в значение «available» (1), затем итерации по упорядоченному результирующему набору строк и переключении значений в хэше на 0 за времена, которые возвращаются из базы данных. Я не уверен, является ли это наиболее эффективным способом сделать это, и я немного обеспокоен использованием памяти и вычислительной интенсивностью этого подхода. Этот расчет не будет происходить постоянно, но его необходимо масштабировать, чтобы он выполнялся как минимум пару сотен раз в день. Похоже, мне также нужно было бы повторно обработать весь хеш, чтобы найти свободные после этого блоки времени, которые кажутся довольно неэффективными.

Есть идеи, как лучше это сделать?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

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

Итак, первый способ, которым я это сделал, был как твой, просто хэш неиспользованных времен. Он медленный, ограниченный и немного расточительный, поскольку мне приходится пересчитывать хэш каждый раз, когда кому-то нужно знать, сколько времени доступно.

Следующий способ, которым я это сделал, - позаимствовать идею у людей из хранилища данных. Я создаю таблицу атрибутов для всех временных интервалов, которые меня интересуют. Если вы создаете такую ​​таблицу, вы можете добавить туда больше информации, кроме времени интервалов. Вы также можете включить такие вещи, как выходные, какой час дня, будь то в обычные рабочие часы, будь то в отпуске, и тому подобное. Затем я должен объединить все слоты между временем начала и окончания, и мои назначения будут недействительными. Итак, это левое соединение, что-то вроде:

SELECT * 
FROM slots 
WHERE ... 
  LEFT JOIN appointments 
    WHERE appointments.id IS NULL

Это избавляет меня от необходимости каждый раз заново создавать хэш, и он использует базу данных для выполнения операций над множествами, что оптимизирует базу данных.

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

0 голосов
/ 25 марта 2011

Почему бы не иметь флаг в строке, которая указывает на это.Когда время выделено, установите флажок для каждой даты / времени в соответствующем диапазоне.Например, 2 мая, с 12:00 до 13:00, будут помечены как недоступные.

Тогда достаточно просто запросить диапазон дат для каждой строки, для которой доступность помечена как истинная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...