Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中存储每周事件的最佳方法?_Mysql_Dayofweek - Fatal编程技术网

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

在MySQL中存储每周事件的最佳方法?,mysql,dayofweek,Mysql,Dayofweek,我有一个每周活动表,在一周中的特定日期(例如MTWTh、MWF等)和特定时间(例如上午8点到下午5点)运行。在MySQL中存储星期几信息的最佳方法是什么,以使检索和处理数据变得最简单?我的CakePHP应用程序需要检索所有正在发生的事件NOW() 对于一天中的时间,我只会利用时间。在一周的几天里,我一直在考虑一个7位的位字段,一个varchar(“MTWThFr”类型的交易),但这两个看起来都像笨重的解决方案(varchar更笨重) 有什么建议吗?既然一周中不会有新的日子出现(我希望!),你可以

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

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


有什么建议吗?

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

选择eventName
从事件中
其中fridayBool=true
和eventStartTimeNOW();
在该示例中,您将在代码中的数组中存储列的名称,并检查今天的日期以查看它是一周中的哪一天,然后在创建查询之前从数组中选择正确的名称

不是最优雅的,但它应该有用

编辑…

表列示例:

  • 事件
  • 事件名
  • 事件开始时间
  • eventEndTime
  • sundayBool
  • 周一布尔
  • 星期六布尔

能否在表中添加DayOfWeek列并将其设置为int?有效值为1到7。您可以在其上添加约束以强制执行该规则。对于时间,BeginTime列和EndTime列如何?他们将是整数以及0-24

对于周一下午5:00的活动,您的桌子上会显示这样的内容

Event_ID DayOfWeek BeginTime EndTime
1        2         1700      1800

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

ENUM("Monday", "Tuesday", ...)
然后,在PHP中,您可以使用datestrottime函数来获取当天的名称:

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

存储当天的名称更易读

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

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

这是一段非常粗糙的代码,但其目的是分解每周信息,使您能够将同一事件与一周中的多个工作日关联起来。

这里有一个简单的方法:

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

如果有人再次这样做,我将通过简单的字符串搜索非常有效地使用SMTWHFA


所以周一周三周五是MWF,周日周一周四是SMH。需要一段时间才能习惯H=周四(第二个字母)和周六=a,但这很有效

我看到的问题是,如何处理一周中多天发生的事件?同一个表中的另一项似乎会使查询复杂化。@jyelton它不会使查询复杂化。您只会得到多行。哦,是的-您可以从表中请求任何以n作为DayOfWeek的行,以确定事件是否安排在该天。但是,您确实存在一个问题(或特性),即必须在多天内填充事件的时间。问题是数据重复;或者,您可以让事件在这些天的不同时间发生。任何最适合您的方法。我想如果时间不随天变化,可以将它们移动到父事件表中,这是一个非常好的一对多解决方案。我倾向于在两个表中执行此操作。事件表和日程表。然后您可以灵活地使用多对一&可以重复使用事件。Coov提供的一对多解决方案使您能够根据需要更改每个事件的时间。但是,您可能必须相应地更改UI,因为事件可能具有每天不同时间的选项。存储一周中某一天的int值将节省空间。枚举不是存储为int吗?在MySQL手册页面上,他们说枚举值从1开始索引。这可能就是为什么建议在更改枚举时将值添加到枚举的末尾,以保留索引。事实上我不知道。。。
select * from Events where Mon = 1