我有一个cron作业,每月通过电子邮件发送用户列表。 cron每天运行并在users表中搜索signup_date。这个想法是在用户注册后1个月邮寄用户,并在帐户有效期内继续这样做。我在考虑做这样的事情:
SELECT *
FROM users
WHERE DAYOFMONTH(signup_date) = DAYOFMONTH(now());
问题是这会在每隔一个月错过用户注册的31日(更不用说闰年2月的问题)。是否有sql语句可以确保每天运行时每个用户至少选择一次?我真的不想在DB中创建额外的字段(例如date_last_emailed)。
答案 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日注册的人。
<强>更新强> 根据评论进行了更正。