Как я могу хранить и запрашивать данные расписания?
Я бы хотел, чтобы мои пользователи могли настроить расписание для своих событий. Это может быть один день или для удобства я бы хотел, чтобы они указали повторяющееся событие (аналогично встрече в 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;