Да, я решил эту проблему со своим коллегой следующим образом:
CREATE TABLE [dbo].[Schedule](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NULL
)
CREATE TABLE [dbo].[ScheduleInterval](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ScheduleID] [int] NOT NULL,
[ScheduleIntervalUnitID] [int] NOT NULL,
[Interval] [smallint] NOT NULL
)
CREATE TABLE [dbo].[ScheduleIntervalUnit](
[ID] [int] NOT NULL,
[Name] [varchar](50) NULL
)
INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name]
Расписание охватывает промежуток времени, и интервалы происходят в течение этого промежутка времени. Единица интервала расписания определяет продолжительность интервала (дни как в «каждые другие» (2) или «каждый третий» (3) и т. Д.), Неделю (день недели, например, понедельник, вторник и т. Д.) И месяц (календарного года). Используя это, вы можете проводить запросы и логику к вашей базе данных для получения расписаний.
Если ваши графики нуждаются в лучшем разрешении - вплоть до часов, минут, секунд - посмотрите на реализацию Unix cron
. Первоначально я пошел по этому пути, но обнаружил, что вышеприведенный подход гораздо более прост и удобен в обслуживании.
Один промежуток времени / даты - например, определенный школьный семестр, начинающийся 9 сентября и заканчивающийся 4 ноября - может содержать несколько расписаний (например, каждый понедельник для класса «Искусство» и «каждый второй день» для Phys Ed - но вы будете нужно больше работать для учета праздников и выходных!).