30

我希望能够创建可以基于固定日期执行的时间表,每天重复,在一周中的特定日期重复,在一年中的特定月份重复,在每年的特定日期重复,并在一天中的特定时间。

请问我该如何为这个问题构建数据库表?

编辑#1

基本上,我正在编写一个应用程序,该应用程序允许用户安排在各种预配置时间发送预配置的问候语。我知道我需要一个表格来存储有关日程安排的信息(例如圣诞节、Marketing One、...| 以及日程安排的运行时间)。然后是另一个表格,记录已运行的日程安排、发送的问候语、发给谁以及使用什么电子邮件;基本上是一个交易表。

我的问题是设计日程表,因为我希望允许用户在特定日期、一周中的特定日期(重复)、每个月的特定日期、每天的特定时间以及每年的特定日期/月份(例如 25/12)。

我如何创建一组以灵活方式处理这些输入的日程表?

4

5 回答 5

28

这是我想出的表结构;

Schedule
 - ScheduleName
 - ScheduleTypeId (Daily, Weekly, Monthly, Yearly, Specific)
 - StartDate
 - IntervalInDays
 - Frequency
 - FrequencyCounter

ScheduleDaily
 - ScheduleDailyId 
 - ScheduleId
 - TimeOfDay
 - StartDate
 - EndDate

ScheduleMonthly
 - ScheduleMonthlyId
 - ScheduleId
 - DayOfMonth
 - StartDate
 - EndDate

ScheduleSpecific
 - ScheduleSpecificId
 - ScheduleId
 - SpecificDate
 - StartDate

...

ScheduleJob
 - ScheduleJobId
 - ScheduleId
 - ScheduleTypeId
 - RunDate
 - ScheduleStatusId
于 2012-09-12T10:37:26.477 回答
28

Microsoft SQL Server 设计高效灵活:https ://msdn.microsoft.com/en-us/library/ms178644.aspx

于 2015-05-14T14:00:04.083 回答
10

我认为接受的答案比它需要的要复杂得多。这可以通过这样的单个表来完成:

Schedules

 - Id :int
 - Greetingid :int
 - Startdate :date
 - Frequencytype :char(1)
 - Frequencyinterval :int
 - Timeofday :time

频率类型将是以下值之一

  • 'O' = 一次
  • 'D' = 每日
  • 'W' = 每周
  • 'M' = 每月
  • 'A' = 每年

频率间隔将是数字,值的含义取决于频率类型的值

  • 如果 type = 'Once' 那么 value = 0(无间隔)计划将在 startdate 执行
  • 如果 type = 'Daily' 那么 value = # of days 间隔
  • 如果 type = 'Weekly' 然后 1 到 7 表示一周中的某一天
  • 如果 type = 'Monthly' 那么 1 到 31 表示该月中的某天
  • 如果 type = 'Annually' 那么 1 到 365 表示一年中的某一天
于 2019-10-23T22:17:44.373 回答
6

我已经阅读了上面的答案,我认为很多事情都是不必要的,如果我错了,请纠正我。

以下是我认为应该做的:

日程


  • ID

  • 类型(每日、每月、每周、固定、每年) - 枚举

  • 频率(可以是 1-7 [星期几]、1-30(或 28)[月份中的几天]、1-365 [一年中的几天] 或 null(对于每日,固定) - ArrayField(整数) - [ 1, 7] 或 [23] 或 [235] 或空

  • 时间(UTC 时间) - ArrayField(字符字符串 - ['9:00', '13:30']

  • 日期(对于固定类型) - 日期时间 - 2009-03-21

  • is_active (boolean) - 用于启用、禁用计划

  • name (CharField) - 如果你想命名时间表

其余字段需要您正在构建的内容的上下文。

现在,为此我正在考虑每 30 分钟运行一次 cronjob(我将输入时间间隔为 30 分钟),它运行一个脚本(在我的情况下为 django 管理命令),该脚本从该表中过滤需要运行的计划:

查询将是这样的:

current_day_of_week = 3
current_day_of_month = 24
current_day_of_year = 114
current_time = 13:30
current_date = 2019-04-24

Filter records that match the below query(not even psuedo code)(I'm using Q objects(https://docs.djangoproject.com/en/2.2/topics/db/queries/#complex-lookups-with-q-objects)

Q(daily AND current_time) OR
Q(weekly AND current_day_of_week AND current_time) OR
Q(monthly AND current_day_of_month AND current_time) OR
Q(yearly AND current_day_of_year AND current_time) OR
Q(fixed AND current_date AND current_time)
于 2019-04-24T10:07:49.297 回答
0

您可以从一个简单的表开始,该表具有以下用于存储计划的通用模式 (PostgreSQL)。考虑称为“作业”的调度运行的每个实例。

CREATE TABLE Schedule (
    id SERIAL UNIQUE,                      -- unique identifier for the job
    name varchar(64) NOT NULL,             -- human readable name for the job
    description text,                      -- details about the job
    schedule varchar(64) NOT NULL,         -- valid CRON expression for the job schedule
    handler varchar(64) NOT NULL,          -- string representing handler for the job
    args text NOT NULL,                    -- arguments for the job handler
    enabled boolean NOT NULL DEFAULT TRUE, -- whether the job should be run
    created_at timestamp NOT NULL,         -- when was the job created
    updated_at timestamp NOT NULL,         -- when was the job updated
    start_date timestamp,                  -- job should not run until this time
    end_date timestamp,                    -- job should not run after this time
    last_triggered_at timestamp,           -- when was the job last triggered
    meta json                              -- additional metadata for the job 
);
于 2020-03-25T06:16:33.920 回答