我正在构建一个自定义事件系统,如果你有一个重复的事件,看起来像这样:
事件A从2011年3月3日开始每4天重复一次
or
赛事B从2011年3月1日开始,每两周在周二举行一次
我如何将其存储在数据库中,使其易于查找。如果有大量的事件,我不希望出现性能问题,而且在呈现日历时,我必须遍历每一个事件。
我正在构建一个自定义事件系统,如果你有一个重复的事件,看起来像这样:
事件A从2011年3月3日开始每4天重复一次
or
赛事B从2011年3月1日开始,每两周在周二举行一次
我如何将其存储在数据库中,使其易于查找。如果有大量的事件,我不希望出现性能问题,而且在呈现日历时,我必须遍历每一个事件。
当前回答
套@dat_ini = 2023-05-20’,@dat_fim = 2022-11-20’; 选择(DATEDIFF(@dat_fim,@dat_ini) % 60
这个< 10
它只在短时间内有效。
要做到这一点,请使用开始日期并更改屏幕上的月份并添加一年,然后从开始日期中减去它,然后就可以工作了。
其他回答
套@dat_ini = 2023-05-20’,@dat_fim = 2022-11-20’; 选择(DATEDIFF(@dat_fim,@dat_ini) % 60
这个< 10
它只在短时间内有效。
要做到这一点,请使用开始日期并更改屏幕上的月份并添加一年,然后从开始日期中减去它,然后就可以工作了。
你举的两个例子很简单;它们可以表示为一个简单的间隔(第一个是4天,第二个是14天)。如何建模完全取决于递归的复杂度。如果上面的内容真的很简单,那么就存储一个开始日期和重复间隔的天数。
然而,如果你需要支持一些事情,比如
事件A从2011年3月3日开始,每月3日重复发生
Or
事件A从2011年3月11日开始在每月的第二个星期五发生
这是一个更复杂的模式。
听起来很像MySQL中存储在系统表中的事件。你可以查看结构并找出哪些列是不需要的:
EVENT_CATALOG: NULL
EVENT_SCHEMA: myschema
EVENT_NAME: e_store_ts
DEFINER: jon@ghidora
EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 5
INTERVAL_FIELD: SECOND
SQL_MODE: NULL
STARTS: 0000-00-00 00:00:00
ENDS: 0000-00-00 00:00:00
STATUS: ENABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2006-02-09 22:36:06
LAST_ALTERED: 2006-02-09 22:36:06
LAST_EXECUTED: NULL
EVENT_COMMENT:
@Rogue编码器
这太棒了!
你可以简单地使用模运算(mysql中的MOD或%)让你的代码在最后变得简单:
而不是:
AND (
( CASE ( 1299132000 - EM1.`meta_value` )
WHEN 0
THEN 1
ELSE ( 1299132000 - EM1.`meta_value` )
END
) / EM2.`meta_value`
) = 1
Do:
$current_timestamp = 1299132000 ;
AND ( ('$current_timestamp' - EM1.`meta_value` ) MOD EM2.`meta_value`) = 1")
为了更进一步,我们可以把那些不会永远重复的事件也包括进来。
可以添加“repeat_interval_1_end”之类的内容,以表示最后一个“repeat_interval_1”的日期。然而,这使得查询更复杂,我真的不知道如何做到这一点…
也许有人可以帮忙!
虽然建议的解决方案是可行的,但我试图用Full Calendar实现,它需要为每个视图调用超过90个数据库(因为它加载当前、以前和下个月),这让我不太兴奋。
我找到了一个递归库https://github.com/tplaner/When,您只需将规则存储在数据库中,并使用一个查询来提取所有相关规则。
希望这能帮助到其他人,因为我花了这么多小时试图找到一个好的解决方案。
编辑:这个库是PHP的