Я работаю над повторением событий, которые могут происходить каждые 1/2/3/4/5 или 6 месяцев / лет.Я нашел некоторые решения здесь, но они в основном для дней / недель.
Также я должен получить события, которые наступают за 15 дней до назначенного времени.Сценарий будет запускаться каждый день в полночь и проверять наличие событий (напоминаний), которые должны быть выполнены в течение 15 дней, и отправлять уведомления (вставить в таблицу).
Вот запрос, который я пытался выполнить.
SELECT *, ABS(TIMESTAMPDIFF(SECOND, first_date - INTERVAL 15 DAY, CURDATE())) AS diff,
TIMESTAMPDIFF(SECOND, first_date, first_date + INTERVAL `repeat` * IF(repeat_type = '0', 1, 12) MONTH) AS tdiff FROM reminders
WHERE
ABS(TIMESTAMPDIFF(SECOND, first_date - INTERVAL 15 DAY, CURDATE())) %
TIMESTAMPDIFF(SECOND, first_date, first_date + INTERVAL `repeat` * IF(repeat_type = '0', 1, 12) MONTH) = 0
OR ABS(TIMESTAMPDIFF(SECOND, first_date, CURDATE())) = 0;
repeat_type
определяет, происходит ли напоминание ежемесячно или ежегодно (0 = ежемесячно, 1 = ежегодно).Атрибут repeat
- это количество (1-6).
Я думаю, что проблема в разнице (2-ой TIMESTAMPDIFF
).Он рассчитывает разницу между двумя датами и возвращает количество секунд.Однако месяцы не равны (28-31 день), и по этой причине по модулю (%) иногда не возвращается ноль.Я думал, что смогу справиться с этим с помощью некоторого диапазона (по модулю должен возвращать 0 или <= 3 дня), но я не уверен, какие значения будут уместны. </p>
Сегодня 12 сентября 2018 года (2018-09-12).Я добавил пару строк в таблицу, которые должны быть 2018-09-27, это 15 дней с сегодняшнего дня.Когда я запускаю вышеуказанный запрос (без предложения where
), я получаю это:
+----+------+------------+--------+-------------+---------+----------+----------+
| id | type | first_date | repeat | repeat_type | message | diff | tdiff |
+----+------+------------+--------+-------------+---------+----------+----------+
| 19 | 0 | 2018-09-27 | 6 | 0 | A | 0 | 15638400 |
| 20 | 1 | 2018-09-27 | 1 | 1 | AA | 0 | 31536000 |
| 21 | 2 | 2018-09-27 | 1 | 1 | AAA | 0 | 31536000 |
| 22 | 3 | 2018-09-27 | 0 | 1 | AAAA | 0 | 0 |
| 23 | 1 | 2018-03-27 | 2 | 0 | OPA | 15897600 | 5270400 |
+----+------+------------+--------+-------------+---------+----------+----------+
Если вы посмотрите на последнюю строку (повторяйте каждые два месяца, начиная с 2018-03-27), она должна быть врезультаты с where
предложением.Но 15897600% 5270400 = 86400 (это один день).