SQL Server Получение повторяющихся встреч по дате - PullRequest
0 голосов
/ 27 сентября 2010

Я работаю над системой хранения встреч и повторяющихся встреч.Моя схема выглядит следующим образом

Appointment
-----------
ID
Start
End
Title
RecurringType
RecurringEnd

RecurringTypes
---------------
Id
Name

Я сохранил простые повторяющиеся типы и поддерживаю только

Week Days,
Weekly,
4 Weekly,
52 Weekly

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

У меня есть хранимая процедура, работающая для неповторяющихся собраний, но я изо всех сил пытаюсь найти лучший способвернуть повторения, это то, что у меня есть до сих пор

ALTER PROCEDURE GetAppointments
(
    @StartDate DATETIME,
    @EndDate DATETIME
)
AS

SELECT  
    appointment.id,
    appointment.title,
    appointment.recurringType,
    appointment.recurringEnd,
    appointment.start,
    appointment.[end]
FROM
    mrm_booking
WHERE
    (
        Start >= @StartDate AND
        [End] <= @EndDate
    ) 

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

Любые указатели на лучший способ справиться с этим было бы замечательно.Я использую SQL Server 2005

Ответы [ 2 ]

0 голосов
/ 08 октября 2010

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

        --Check Week Days Reoccurrence
        (
            mrm_booking.repeat_type_id = 1 AND              
            #ValidWeeklyDayOfWeeks.dow IN (1,2,3,4,5)
        ) OR
        --Check Weekly Reoccurrence
        (
            mrm_booking.repeat_type_id = 2 AND
            DATEPART(WEEKDAY, mrm_booking.start_date) = #ValidWeeklyDayOfWeeks.dow
        ) OR
        --Check 4 Weekly Reoccurences
        (
            mrm_booking.repeat_type_id = 3 AND
            DATEDIFF(d,#ValidWeeklyDayOfWeeks.[Date],mrm_booking.start_date) % (7*4) = 0
        ) OR
        --Check 52 Weekly Reoccurences
        (
            mrm_booking.repeat_type_id = 4 AND
            DATEDIFF(d,#ValidWeeklyDayOfWeeks.[Date],mrm_booking.start_date) % (7*52) = 0
        )

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

INSERT INTO #ValidWeeklyDayOfWeeks
--Get Valid Reoccurence Dates For Week Day Reoccurences
SELECT
    DATEADD(d, offset - 1, @StartDate) AS [Date],
    DATEPART(WEEKDAY,DATEADD(d, offset - 1, @StartDate)) AS Dow
FROM
    (
        SELECT ROW_NUMBER() OVER(ORDER BY s1.id) AS offset
        FROM syscolumns s1, syscolumns s2
    ) a WHERE offset <= DATEDIFF(d, @StartDate, DATEADD(d,1,@EndDate)) 

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

0 голосов
/ 27 сентября 2010

вам нужно хранить повторяющиеся даты в виде каждой отдельной строки в расписании. то есть вам нужно расширить повторяющиеся даты при первоначальном сохранении. Без этого невозможно (или чрезвычайно сложно) расширять их на лету, когда вам нужно их увидеть, проверить на наличие конфликтов и т. Д., Чтобы все встречи работали одинаково, поскольку все они фактически будут иметь ряд в таблицу для загрузки и т. д. Я хотел бы предложить, чтобы, когда пользователь указывает свою повторяющуюся дату, вы заставляли его выбирать фактическое количество повторяющихся вхождений. Когда вы захотите сохранить эту повторяющуюся встречу, разверните их все как отдельные строки в таблице. Вы можете использовать FK для строки родительских встреч и связать их как связанный список:

Appointment
-----------
ID
Start
End
Title
RecurringParentID  FK to ID

образец данных:

ID ....  RecurringParentID
1  ....  null
2  ....  1
3  ....  2
4  ....  3
5  ....  4

если в середине выполнения графика повторяющихся встреч, скажем, ID = 3, они решают отменить их, вы можете следовать по цепочке и удалить оставшийся ID = 3,4,5.

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

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