如何从表格中选择*每月的某一天=当月的当天,并且不会错过31日的用户

时间:2012-10-09 19:31:38

标签: mysql cron

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

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

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

2 个答案:

答案 0 :(得分:3)

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

WHERE IF(
  DAY(NOW()) == DAY(LAST_DAY(NOW())),
  DAY(signup_date) >= DAY(NOW()),
  DAY(signup_date) = DAY(NOW())
)

答案 1 :(得分: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日注册的人。

<强>更新 根据评论进行了更正。