在MySQL中存储每周事件的最佳方法?
我有一个每周活动表,在一周中的特定日期(例如MTWTh、MWF等)和特定时间(例如上午8点到下午5点)运行。在MySQL中存储星期几信息的最佳方法是什么,以使检索和处理数据变得最简单?我的CakePHP应用程序需要检索所有正在发生的事件在MySQL中存储每周事件的最佳方法?,mysql,dayofweek,Mysql,Dayofweek,我有一个每周活动表,在一周中的特定日期(例如MTWTh、MWF等)和特定时间(例如上午8点到下午5点)运行。在MySQL中存储星期几信息的最佳方法是什么,以使检索和处理数据变得最简单?我的CakePHP应用程序需要检索所有正在发生的事件NOW() 对于一天中的时间,我只会利用时间。在一周的几天里,我一直在考虑一个7位的位字段,一个varchar(“MTWThFr”类型的交易),但这两个看起来都像笨重的解决方案(varchar更笨重) 有什么建议吗?既然一周中不会有新的日子出现(我希望!),你可以
NOW()
对于一天中的时间,我只会利用时间。在一周的几天里,我一直在考虑一个7位的位字段,一个varchar(“MTWThFr”类型的交易),但这两个看起来都像笨重的解决方案(varchar更笨重)
有什么建议吗?既然一周中不会有新的日子出现(我希望!),你可以为每一天创建一个bool列。然后,如果您正在运行查询以查找星期五的事件,那么它将是(带有一点伪代码):
选择eventName
从事件中
其中fridayBool=true
和eventStartTimeNOW();
在该示例中,您将在代码中的数组中存储列的名称,并检查今天的日期以查看它是一周中的哪一天,然后在创建查询之前从数组中选择正确的名称
不是最优雅的,但它应该有用
编辑…
表列示例:
- 事件
- 事件名
- 事件开始时间
- eventEndTime
- sundayBool
- 周一布尔
- 星期六布尔
Event_ID DayOfWeek BeginTime EndTime
1 2 1700 1800
为什么不多行,每行只有一列包含星期几。本专栏只是一个简单的例子:
ENUM("Monday", "Tuesday", ...)
然后,在PHP中,您可以使用date和strottime函数来获取当天的名称:
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