Как я могу хранить и запрашивать данные расписания?

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

Для отдельного события это кажется довольно простым (псевдокод):

Просто имейте столбец DateOfEvent, в котором есть дата.

Чтобы захватить будущие события:

Выберите * из событий, где DateOfEvent> {DateTime.Now}

Но как я могу сохранить и запросить повторяющееся событие? Мне не нужно делать времена, так как я просто храню это отдельно, и если им нужно другое время, я просто заставлю их создать другое событие. Так нет: каждую среду в 5 и в четверг в 3.

Примеры:

Каждый понедельник, вторник, чт, чт, пт, каждую неделю

Каждый брак каждую неделю

Каждый второй вторник месяца

Что я использовал для запроса

Я добавил даты начала и окончания. Если пользователь выбрал одну дату, я установил начальную и конечную даты на выбранную дату. Мне просто пришлось немного изменить код ответа.

DECLARE 
    @StartDate SMALLDATETIME, 
    @EndDate   SMALLDATETIME;

SELECT
    @StartDate = '20091129',
    @EndDate   = '20101220';

SELECT
    d.CurrentDate,
    m.*
FROM
    Calendar AS d
    INNER JOIN Meet AS m
    ON
    (
        (d.CurrentDate = m.StartDate AND d.CurrentDate = m.EndDate)
        OR d.DaysOfTheMonth = m.DayOfTheMonth
        OR (d.DaysOfTheWeek = m.DayOfTheWeek AND COALESCE(m.WeekOfTheMonth, d.WeekOfTheMonth) = d.WeekOfTheMonth)
        OR d.DaysOfTheWeek IN (1,7) AND m.OnWeekends = 1
        OR d.DaysOfTheWeek BETWEEN 2 AND 6 AND m.OnWeekDays = 1
    )
    -- now you can inner join to the event table
    -- to list the name, other details, etc.
    WHERE
        d.CurrentDate BETWEEN @StartDate AND @EndDate
        AND d.CurrentDate BETWEEN m.StartDate AND m.EndDate
        ORDER BY d.CurrentDate;

GO

Заполнение таблицы Calandar:

INSERT dbo.Calendar(CurrentDate, DaysOfTheMonth, DaysOfTheWeek, WeekOfTheMonth, IsWeekDay, Even) 

    SELECT
    CurrentDate, DaysOfTheMonth, DaysOfTheWeek,
    WeekOfTheMonth = DATEDIFF(WEEK, DATEADD(DAY, 1-DaysOfTheMonth, CurrentDate), CurrentDate) + 1,
    CASE WHEN DaysOfTheWeek IN (1, 7) THEN 0 ELSE 1 END AS IsWeekDay,
    CASE WHEN w % 2 = 1 THEN 0 ELSE 1 END AS Even
    FROM 
    (
      SELECT
        CurrentDate,
        DaysOfTheMonth = DATEPART(DAY, CurrentDate),
        DaysOfTheWeek = DATEPART(WEEKDAY, CurrentDate),
        w = DATEPART(WEEK, CurrentDate)
      FROM 
      (
        SELECT CurrentDate = DATEADD(DAY, n-1, '20141001')
        FROM
        (
          SELECT TOP 900 
            n = ROW_NUMBER() OVER (ORDER BY c1.[object_id])
            FROM sys.all_columns AS c1
            CROSS JOIN sys.all_columns AS c2
            ORDER BY n
        ) AS x) AS y) AS z;

Ответы на вопрос(3)

Ваш ответ на вопрос