我正在研究每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
). 它计算两个日期之间的差值并返回秒数。然而,月份并不相等(28-31天),因此模(%)有时不返回零。我想我可以用某种范围来处理这个问题(模必须返回0或<=3天),但我不确定什么值是合适的。
今天是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开始,每两个月重复一次),它应该出现在结果中 where
条款。但是15897600%5270400=86400(那是一天)。
暂无答案!
目前还没有任何答案,快来回答吧!