9

我有一个每周事件表,这些事件在一周中的某些日子(例如 MTWTh、MWF 等)并在特定时间(例如上午 8 点至下午 5 点)运行。在 MySQL 中存储星期几信息以使检索和处理数据最容易的最佳方法是什么?我的 CakePHP 应用程序需要检索所有发生的事件NOW()

对于一天中的时间,我只会使用 TIME。对于一周中的几天,我考虑了一个 7 位位域,一个 varchar(“MTWThFr”类型的交易)用于一周中的几天,但这两个似乎都是笨拙的解决方案(varchar 更笨拙)。

有什么建议么?

4

6 回答 6

11

这是一个简单的方法:

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
于 2010-05-14T18:22:44.617 回答
4

你能在你的表中添加一个 DayOfWeek 列并将其设为 int 吗?该值的有效值为 1 到 7。您可以在其上添加一个约束以强制执行该规则。对于时间,BeginTime 列和 EndTime 列怎么样?它们也是 int 的 0-24

对于周一下午 5:00 的活动,您的表中将如下所示

Event_ID DayOfWeek BeginTime EndTime
1        2         1700      1800
于 2010-05-14T17:58:11.933 回答
1

为什么不有几行,每行只有一列包含星期几。本专栏很简单:

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

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

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

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

于 2010-05-14T18:09:25.777 回答
1

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

所以周一周三周五将是 MWF,周日周一周四将是 SMH。需要一段时间才能习惯 H=Thursday(第二个字母)和 Saturday=A,但它确实有效!

于 2014-10-14T20:19:55.667 回答
0

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

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

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

不是最优雅的,但它应该可以工作。

编辑...

示例表列:

  • 事件ID
  • 事件名称
  • 事件开始时间
  • 事件结束时间
  • 星期日布尔
  • 星期一布尔
  • ...
  • 星期六布尔
于 2010-05-14T17:57:46.493 回答
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

这是非常粗略的代码,但其想法是分解每周信息,允许您将同一事件与一周中的多天相关联。

于 2010-05-14T18:12:17.203 回答