我正在研究每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)。
我认为问题在于差异(第二
TIMESTAMPDIFF
今天是2018年9月12日(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开始每两个月重复一次),结果中应该有
哪里
条款。