Повторяющиеся события, SQL-запрос

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

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

события хранятся в таблице событий, которая содержит даты начала и окончания и "идентификатор типа рекуррентности". Если "тип рекуррентности" - "нет", то даты начала и окончания будут одинаковыми. Таблица событий содержит идентификатор отдельной таблицы, содержащей имя типа события, например. "Встреча" или " еженедельник докладывайте!--9-->

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

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

это дает поиск как:

что именно то, что требуется для поиска повторяющихся событий, давая выход, как:

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

мой вопрос: Как я могу объединить эти запросы, чтобы придумать один список, который содержит все события, как повторяющиеся, так и не повторяющиеся по дате порядок?


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


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

как бы вы сохранили возможно повторяющиеся раз?

каков наилучший способ моделирования повторяющихся событий в приложении календаря?

должен ли я хранить даты или правила повторения в моей базе данных при создании приложения календаря?

или

http://tools.ietf.org/html/rfc5545

Я проверил их, и они были очень полезны, но не делают то же самое, что мы намерены.

ТИА

2 ответов


SELECT DISTINCT(e.eventid),n.nameid,n.firstname,n.lastname,d.dt,r.recurring
FROM dates d 
LEFT JOIN recurringtypes r
/* if event recurring every week E.g. 'Every Monday' */
ON (r.rectypeid BETWEEN 2 AND 8 AND r.day = d.dow) 
/* if event recurring every month E.g. 'First Monday, every month' */
OR ((r.rectypeid BETWEEN 9 AND 36) AND r.day = d.dow AND r.occurrence = d.occurrence) 
/* if event recurring every last week of month E.g. 'Last Monday, every month' */
OR (r.rectypeid >= 37 AND r.day = d.dow and r.islast = d.islast)
LEFT JOIN events e on e.rectypeid = r.rectypeid OR (e.rectypeid <= 1 AND e.eventid IS NOT NULL) 
LEFT JOIN eventtypes t ON e.eventtypeid = t.eventtypeid
LEFT JOIN names n ON e.namesid = n.namesid
WHERE (d.dt BETWEEN '2012/02/01' AND '2012/05/01')
ORDER BY d.dt;

Если я не упускаю что-то, ответ удивительно прост. Я не понимал, что объединения могут быть отсортированы по общим столбцам с помощью псевдонима, даже если эти столбцы из разных таблиц. Таким образом, полный запрос будет:

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