每月选择 x 天前的记录的 MySql 查询

4

我有一张名为tbl_subscriptions的表格,包含"ID,用户姓名,加入日期(date)"等列。我想根据加入日期在每个月的前7天选择用户,以便我可以向他们发送通知,让他们续订下一个月的订阅服务。我的记录如下:

1, user1, 2014-05-02
2, user2, 2014-05-04
3, user3, 2014-06-12
4, user4, 2014-06-20
4, user5, 2014-07-24

如果今天是2014年7月28日,那么我想获取记录1和2。我尝试了以下查询。
SELECT  *, 
        datediff( date_format(date, '2014-07-%d'), now() ) as daysLeft 
FROM    tbl_subscriptions 
HAVING  daysLeft >= 0 
    AND daysLeft < 7

以上SQL的问题在于它只选择当前月份的记录,请建议更好的查询。


我不知道这是否有帮助?https://dev59.com/2Ww15IYBdhLWcg3wLIo2 - Alex
2个回答

1
这个是否符合你的要求?
SELECT s.*, datediff(date, curdate()) as daysLeft
FROM tbl_subscriptions s
WHERE date >= curdate() and date < curdate() + interval 7 day;

编辑:

我明白了。这些是循环订阅,您想找到下一个订阅。以下逻辑应该有效:

select s.*,
       (case when day(date) >= day('2014-07-28')
             then day(date) - day('2014-07-28')
             else day(date) + day(last_day('2014-07-28')) - day('2014-07-28')
        end) as diff
from tbl_subscriptions s
having diff <= 7;

这是一个 SQL Fiddle,链接在这里

这不会起作用,因为 OP 检查的是每月的日期而不是实际日期(具体来说是时间间隔)。基本上,在每个月的 28 日,他想将所有邮件发送给在任何一个月的 29 日至 4 日之间注册的所有订阅者。 - Anuj Patel

0

首先,我不知道什么是订阅续订期。只检查日期(而不是整个期间)的想法对我来说没有意义。 但这样可以让你得到所需的输出。

SELECT *, 
       day(date) days, 
       day(last_day('2014-07-28')) as lastday, 
       day('2014-07-28') today, day(last_day('2014-07-28'))-day('2014-07-28') as diff
FROM tbl_subscriptions
having days <= (7-diff) or (days > today and days <= today+7)

这里是演示(模式感谢其中一个已删除的答案)-> http://sqlfiddle.com/#!2/3cc4f

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接