代码之家  ›  专栏  ›  技术社区  ›  Covik

MySQL每月/每年重复事件

  •  1
  • Covik  · 技术社区  · 6 年前

    我正在研究每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开始每两个月重复一次),结果中应该有 哪里 条款。

    0 回复  |  直到 6 年前