- функция DATEDIFF() даёт разницу в днях между двумя датами.
- функция PERIOD_DIFF() даст разницу в месяцах (внимание на формат аргументов!);
- оператор % или MOD остаток от деления.
Это для «каждые N дней / месяцев».
Для «каждое 20-е число» просто проверяйте текущую дату.
И, разумеется, не нужно это повторять каждые 5 минут в течение всего дня-икс )
старый ответДве таблицы: события и напоминания о них. При изменении настроек напоминания о событии обновлять записи в таблице напоминаний. Так не придётся перевычислять моменты напоминаний снова и снова.
Прописывать в таблице напоминаний event_id
события и datetime
каждого напоминания о нём с сегодняшней даты до даты события.