在MySQL中存储每周事件的最佳方式?

时间:2010-05-14 17:46:46

标签: mysql dayofweek

我有一个每周活动的表格,该表格在一周中的某些日子(例如MTWTh,MWF等)运行并且在某个时间(例如上午8点到下午5点)运行。在MySQL中存储星期信息以最简单地检索和处理数据的最佳方法是什么?我的CakePHP应用程序需要检索NOW()发生的所有事件。

对于一天中的时间,我只会使用TIME。在一周中的几天里,我考虑过一个7位的字段,一周的varchar(“MTWThFr”类型交易),但这两个看起来都像笨重的解决方案(varchar很笨重)。

有什么建议吗?

6 个答案:

答案 0 :(得分:10)

这是一种直截了当的方式:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  0   0   0   1   0   0   0   14-01-2010    14-01-2033

使用方法:

只需在您想要运行它的日期设置1即可。由于7天的日历不太可能很快改变,因此该结构应该是不可变的。您可以选择任意天数组合。

回顾一下:

每周四运行:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  0   0   0   1   0   0   0   14-01-2010    14-01-2033

每周四运行&星期一:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  1   0   0   1   0   0   0   14-01-2010    14-01-2033

此外,每个事件计划只能获得一行,这样可以更方便,更清晰地以编程方式处理。

例如,要查找星期一要执行的所有事件,请执行以下操作:

select * from Events where Mon = 1

答案 1 :(得分:4)

您可以在表中添加DayOfWeek列并使其成为int吗?有效值为1到7.您可以在其上添加约束以强制执行该规则。对于时间,BeginTime列和EndTime列怎么样?他们也会是0到24岁

对于周一下午5:00的活动,您的表格中会显示如下内容

Event_ID DayOfWeek BeginTime EndTime
1        2         1700      1800

答案 2 :(得分:1)

为什么不有几行,每行只有一列包含星期几。这一栏只是一个简单的:

ENUM("Monday", "Tuesday", ...)

然后,在PHP中,您可以使用日期 strtotime 函数来获取当天的名称:

echo date('l');
echo date('l', strtotime('mon'));
// Outputs "Monday"

存储当天的名称更具可读性。

答案 3 :(得分:1)

如果有人再次使用这种方式,我会通过简单的字符串搜索非常有效地使用SMTWHFA。

周一周一周三将是MWF,周日周一将是SMH。需要一段时间才能习惯H =星期四(第二个字母)和星期六= A但是它有效!

答案 4 :(得分:0)

由于本周不会发明任何新的日子(我希望!),你可以为每一天创建一个bool列。然后,如果您正在运行查询以在星期五查找事件,那么它将只是(带有一些伪代码):

SELECT eventName
FROM events
WHERE fridayBool = true
AND eventStartTime < NOW()
AND eventEndTime > NOW();

在该示例中,您将在代码中存储在数组中的列的名称,并检查今天的日期以查看它的星期几,然后在创建查询之前从数组中选择正确的名称。

不是最优雅的,但应该有效。

修改...

示例表列:

  • EVENTID
  • eventName的
  • eventStartTime
  • eventEndTime
  • sundayBool
  • mondayBool
  • ...
  • saturdayBool

答案 5 :(得分:0)

将每周信息完全分解为一个单独的表:

events: id, beginTime, endTime, name, description
eventsbyday: id, dayofweek, event_id

这样您就可以根据当天的当前日期查询eventsbyday

SELECT events.name, events.beginTime, events.endTime FROM eventsbyday JOIN events ON eventsbyday.event_id=events.id WHERE dayofweek=0

这是非常粗略的代码,但我们的想法是打破每周信息,让您可以在一周中的多个日子中发生相同的事件。