SQL无限日历模式

Rob*_*lin 33 php mysql calendar codeigniter

我将创建一个基于Mysql的日历系统,你可以在其中重复模式,让我们永远地说每个星期一.它还必须涵盖静态/一次性事件.我想知道的是,哪种解决方案对我来说最合乎逻辑(也是最好的).我有四种方法,我想知道它们之间的选择.

方法#1

请它接受参数的函数fromto.此函数将创建一个临时表表,该表通过导入现有的静态计划INSERT ... SELECT.之后它将读取模式表并通过基于from和的peroid填充临时表to.

这个解决方案看起来很不错,因为查询将更简单地获取数据并且它可以工作到无穷大,因为您可以根据您加载的月份重新填充表格.我很好奇的是,无论何时这可能是一种迟滞的方式.

方法#2

通过子查询和JOIN静态日历创建和连接给定的模式.

这似乎很烦人,因为查询会更大,并且可能根本不会很好(?).

方法#3

基本上只是INSERT模式让我们说一年前.然后我猜一个cron工作会重新制作,总是提前一年.

这是一种简单的方法,但感觉就像存储了大量不需要的数据,并没有真正给出我所追求的无限.

方法#4(Veger建议)

如果我理解正确,此方法将从另一个查询中获取模式并在执行时创建事件.这与我对方法#1的想法类似,我认为简单模式可以创建多行.

但是,如果这将在Mysql之外实现,我将丢失一些我想要的数据库功能.


我希望你们了解我的情况,如果你能提出建议或争论为什么它是最好的或给出另一种解决方案.

就个人而言,我最喜欢方法#1,但我很好奇,如果每次调用重新填充日历表都很迟钝.

Jor*_*son 14

我之前已经建立了这种日历.我发现最好的办法就是按照计划的方式来接近它.因此,在数据库中,为分钟,小时,星期几,月和星期几创建一个字段.

对于6月和8月的每个星期五晚上10点的活动,您的参赛作品将会是这样的

Minute  Hour  DayOfMonth  Month  DayOfWeek
 0       22     *          6,8       5
Run Code Online (Sandbox Code Playgroud)

然后,您可以将一个字段标记为一次性事件,该事件将忽略此信息并仅使用开始日期和持续时间.对于最终重复该事件的事件(比如说每个周末3个月),您只需要添加结束日期字段.

这将允许您轻松地选择它并减少需要存储的数据量.它还简化了您的查询.

我认为不需要创建临时表.要选择返回相关事件,您可以通过日历视图选择它们.如果您的日历视图是按月计算的,那么您的选择将如下所示:

SELECT Events.* 
FROM Events 
WHERE (Month LIKE '%,'.$current_month.',%' OR Month = '*') 
    AND DATE(StartDate) >= "'.date('Y-m-d', $firstDayOfCurrentMonth).'" 
    AND DATE(EndDate) <= "'.date('Y-m-d', $lastDayOfCurrentMonth).'"
Run Code Online (Sandbox Code Playgroud)

显然,这应该是一份准备好的声明.它还假设您在逗号分隔的月份列表中的第一个和最后一个值之前和之后都有一个逗号(即.,2,4,6,).如果您愿意,还可以Month在两者之间创建表和连接表.在渲染日历时,其余部分可以通过php解析出来.

如果您显示日历的每周视图,则可以通过以下方式选择:

SELECT Events.* 
FROM Events 
WHERE (DayOfMonth IN ('.implode(',', $days_this_week).','*') 
    AND (Month LIKE '%,'.$current_month.',%' OR Month = '*')) 
    AND DATE(StartDate) >= "'.date('Y-m-d', $firstDayOfCurrentMonth).'" 
    AND DATE(EndDate) <= "'.date('Y-m-d', $lastDayOfCurrentMonth).'"
Run Code Online (Sandbox Code Playgroud)

我没有测试那些查询,所以可能有一些混乱的括号或其他东西.但那将是一般的想法.

因此,您可以为您正在显示的每一天运行选择,也可以选择返回视图的所有内容(月,周等)并循环每天的事件.


Exp*_*lls 9

我最喜欢Veger的解决方案..而不是填充多行,你可以填充模式.我建议crontab格式..无论如何它都运作良好.

您可以在加载日历时查询给定客户的所有模式,并根据模式填写事件.除非你有一个单一用户的数千种模式,否则这应该不会那么慢.它也应该比长时间存储大量行事件更快.您必须一次选择所有模式并进行一些预处理,但是再一次,您希望每个用户有多少个模式?即使1000左右也应该非常快.