MySQL повторяет события ежемесячно / ежегодно - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над повторением событий, которые могут происходить каждые 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 (это один день).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...