Как создать повторяющиеся события календаря?

Я использую asp mvc 3, jQuery полный календарь, ms sql sever 2008 и c#.

Мне интересно, знает ли кто-нибудь, как сделать повторяющиеся события?

Я не уверен, как сделать их.

например, в календаре google вы можете сделать встречу повторяться ежегодно навсегда. Я сомневаюсь, что они генерируют это назначение X раз в базе данных.

Мне интересно, как я мог бы одной строкой в моей БД и как-то знать, что, когда необходимый.

также Календарь google и outlook имеют множество повторяющихся опций, таких как повтор в 1-м месяце, в прошлом месяце и т. д.

есть ли какие-либо библиотеки, которые имеют это? Или я должен сделать это с нуля?

П. С.

Я на общем хосте, поэтому решение должно работать с ограниченными правами.

3 ответов


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

требуется немного больше работы, но решение состоит в том, чтобы в основном хранить таблицу (или таблицы) правил повторения, с которыми вы связываете свои записи календаря при создании календаря:

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

сколько из этих проверок вам нужно сделать, зависит от того, сколько типов (и продолжительность) повторений вы хотели.

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

комментарий followup:

Ну, у вас будет стандартная таблица записей календаря, чтобы сохранить основную информацию. Дата/Время и т. д... Затем, по крайней мере, две другие таблицы для хранения повторной информации. Который хранит ваши правила повторения. "каждый понедельник"," первый день месяца"," каждый год " и др..., и третья таблица, которая связывает между записями календаря и правилами

так:

 calendar entries table  <--->  link table  <--->  repeat rules table

запрос будет вопросом построения вещей, поэтому что для даты, которую вы рассматриваете, соответствующие правила выходят и дают вам идентификаторы записей календаря для отображения. Может стать некрасивым, если вы делаете причудливый запрос, который динамически связывается с соответствующими правилами на основе даты, которую вы передали.


поскольку вы включили тег #google-calendar, я предполагаю, что это то, с чем вы работаете. Календарь Google использует вызовы REST и JSON. Вот пример:

{
  "summary": "Daily project",
  "start": {
    "dateTime": "2011-12-12T10:00:00",
    "timeZone": "Europe/Zurich"
  },
  "end": {
    "dateTime": "2011-12-12T11:00:00",
    "timeZone": "Europe/Zurich"
  },
  "recurrence": [
    "RRULE:FREQ=DAILY;COUNT=5"
  ]
}

это создаст событие под названием "ежедневный проект", которое происходит ежедневно с 10 до 11 утра и повторяет его в течение 5 дней подряд.

поскольку вы используете C#, вы также можете использовать объект события Google API (v3). Это имеет все свойства, необходимые для создания рекурсивного события. Однако, вы все равно следует взглянуть на структуру JSON, чтобы выяснить, как формируются правила рекурсии.

Если вы не используете Календарь Google, вы все равно можете использовать их API в качестве руководства: просто создайте правила для повторяющихся событий, а не фактических экземпляров. Используйте поток или таймер, чтобы каждую минуту запрашивать в базе данных новые события на основе отдельных событий (которые не имеют правил рекурсии) и повторяющихся правил событий.


всякий раз, когда кто-то задает такой вопрос, появляется ссылка на книгу "разработка ориентированных на время приложений баз данных в SQL". Он доступен законно как бесплатный PDF и Амазонка.