我有一个每周活动的表格,该表格在一周中的某些日子(例如MTWTh,MWF等)运行并且在某个时间(例如上午8点到下午5点)运行。在MySQL中存储星期信息以最简单地检索和处理数据的最佳方法是什么?我的CakePHP应用程序需要检索NOW()
发生的所有事件。
对于一天中的时间,我只会使用TIME。在一周中的几天里,我考虑过一个7位的字段,一周的varchar(“MTWThFr”类型交易),但这两个看起来都像笨重的解决方案(varchar很笨重)。
有什么建议吗?
答案 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();
在该示例中,您将在代码中存储在数组中的列的名称,并检查今天的日期以查看它的星期几,然后在创建查询之前从数组中选择正确的名称。
不是最优雅的,但应该有效。
修改... 强>
示例表列:
答案 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
这是非常粗略的代码,但我们的想法是打破每周信息,让您可以在一周中的多个日子中发生相同的事件。