, start_date ( ), . , , , , , .
, , :
+------------+
| 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
;
, ,