1

我有一个 cron 工作,每月通过电子邮件发送用户列表。cron 每天运行并在 users 表中搜索 signup_date。我们的想法是在用户注册后 1 个月向他们发送邮件,并在他们的帐户生命周期内继续这样做。我正在考虑做这样的事情:

SELECT *
FROM users 
WHERE DAYOFMONTH(signup_date) = DAYOFMONTH(now());

问题是这将错过每隔一个月在 31 日注册的用户(更不用说 2 月的闰年问题)。是否有 sql 语句可以确保每个用户在每天运行时每月至少被选中一次?我也不想在数据库中创建一个额外的字段(例如 date_last_emailed)。

4

2 回答 2

3

也许在该月的最后一天包括当天或更晚注册的所有用户?

WHERE IF(
  DAY(NOW()) == DAY(LAST_DAY(NOW())),
  DAY(signup_date) >= DAY(NOW()),
  DAY(signup_date) = DAY(NOW())
)
于 2012-10-09T19:40:43.970 回答
0
SELECT a, b
  FROM tbl
 WHERE DAYOFMONTH(signup_date) = DAYOFMONTH(CURRENT_DATE)
       OR
       -- special handling for end of month
       (LAST_DAY(CURRENT_DATE) = CURRENT_DATE
        AND
        DAYOFMONT(signup_date) > DAYOFMONTH(CURRENT_DATE))

在非闰年的 2 月 28 日,这将向在任何一个月的 29 日、30 日或 31 日注册的人发送电子邮件。

更新 根据评论更正。

于 2012-10-09T19:46:37.300 回答