我正在尝试使用 PHP/MySQL 在日历上臭名昭著的重复事件。我终于找到了一些似乎有效的东西。我在这里找到了答案,但我很难完成它。
我的第一张桌子“活动”。
ID NAME
1 Sample Event
2 Another Event
我的第二个表 'events_meta 存储重复数据。
ID event_id meta_key meta_value
1 1 repeat_start 1336312800 /* May 7th 2012 */
2 1 repeat_interval_1 432000 /* 5 days */
repeat_start 是一个没有时间作为 unix 时间戳的日期,而 repeat_interval 是间隔之间的秒数(432000 是 5 天)。
然后我有以下 MySQL,我从上面的链接稍微修改了它。下面使用的时间戳(1299132000,即 2012 年 5 月 12 日)是没有时间的当天。
SELECT EV.*
FROM `events` EV
RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id`
RIGHT JOIN `events_meta` EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` )
WHERE EM1.meta_key = 'repeat_start'
AND (
( CASE ( 1336744800 - EM1.`meta_value` )
WHEN 0
THEN 1
ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value`
END
)
) = 1
在上面的 MySQL 中,以下代码EM1.'meta_value'
从当前日期中减去 repeat_start 字段 (),然后除以重复间隔字段 ( EM2.'meta_value'
)。
ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value`
或者
TODAYS DATE - START DATE / 5 DAYS
所以这里是数学:
1336744800 - 1336312800 = 432000
432000 / 432000 = 1
现在效果很好。但是,如果我提前 5 天将当前时间戳更改为 1336312800,即 17th Mat 2012,它看起来有点像这样:
1336312800 - 1336312800 = 864000
86400 / 432000 = 2
哪个不起作用,因为它等于 2 而在 MySQL 中它需要等于 1。所以我想我的问题是,如何让 MySQL 识别一个整数而不是必须这样做?
...
WHERE EM1.meta_key = 'repeat_start'
AND (
( CASE ( 1336744800 - EM1.`meta_value` )
WHEN 0
THEN 1
ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value`
END
)
) = IN (1,2,3,4,5,6,7,8,....)
希望我是有道理的,我希望这只是一个简单的数学问题或 MySQL 具有的函数会有所帮助:) 感谢您的帮助!
编辑:答案
感谢下面的@eggypal,我找到了答案,当然很简单!
SELECT EV.*
FROM elvanto_calendars_events AS EV
RIGHT JOIN elvanto_calendars_events_meta AS EM1 ON EM1.`event_id` = EV.`id`
RIGHT JOIN elvanto_calendars_events_meta AS EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` )
WHERE EM1.meta_key = 'repeat_start'
AND ( ( 1336744800 - EM1.`meta_value` ) % EM2.`meta_value`) = 0