我正在建立活动日历.基本功能如下:
每天有3个状态,“可用”,“不可用”和“需要确认”.每天都可以设置为一个状态(即事件).可以将每个事件设置为每周或每月重复一次,或者完全不重复.
每个日历都特定于一个对象(每个对象都有自己的日历).
日历没有“结束日期”:将来的任何给定日期都可能有事件.
我想象的数据模型是这样的:
Table: Calendar
id
user_id
Table: Status
id
label
Table: Event
id
calendar_id
start_date
status_id
recurring -- enum type: NULL, W, or M for weekly or monthly
这似乎是存储数据的一种相当优雅的方式,但是我担心检索:获取给定日期的状态会相当复杂.
是否有更好的或标准的方法来执行此操作?
解决方法:
假设那天是开始日期(否则我会误会),那么格式对我来说似乎还不错.稍后,您可能需要有开始/结束日期以及开始/结束时间,在这种情况下,您将必须添加时间戳.
为了检索数据,我将创建一个日期表,如下所示:
+------------+
| cday (PK) |
+------------+
| ... |
| 2011-01-01 |
| 2011-01-02 |
| 2011-01-03 |
| 2011-01-04 |
| 2011-01-05 |
| 2011-01-06 |
| ... |
+------------+
如果您需要在给定时间内获取状态为A(可用)的约会,则可以执行以下操作
SELECT ev.*
FROM cdays AS cd
JOIN event AS ev ON (
CHECK_RECCUR(cd.cday, ev.day, cd.recurring)
)
WHERE TRUE
AND cd.cday BETWEEN "given_start" AND "given_end"
AND ev.day < "given_end"
;
CHECK_RECCUR()将是一个检查cday是否在递归范围内的函数,如下所示:
CREATE FUNCTION CHECK_RECCUR(cday DATE, start_date DATE, recurring CHAR(1))
BEGIN
IF cday < start_date
THEN RETURN FALSE
END IF;
SET dformat = CASE recurring
WHEN 'W' THEN '%W'
WHEN 'M' THEN '%d'
WHEN 'Y' THEN '%m-%d'
ELSE ''
END;
RETURN (DATE_FORMAT(cday, dformat) == DATE_FORMAT(start_date, dformat));
END
;
未经测试,但这是我要做的
标签:calendar,mysql
来源: https://codeday.me/bug/20191208/2094424.html