如何进行这个时间窗查询?

时间:2017-02-02 14:46:18

标签: php mysql date

我有一个包含以下列的MySQL表:

id, month, day, remind_days_before

它是一个简单的重复提醒功能。用户可以输入例如:"我每年4月5日都有一件非常重要的事情,请提前15天提醒#34;此表中可能有数万个条目。使用这个表我想每天早上运行一个cron_job,它以电子邮件的形式发送这个提醒。问题是我不知道如何编写这种SQL查询......它甚至可能吗?我想只查询那些"月"和" day"由于DATE介于今天和今天+31天之间(这是remind_days_before的最大数量)。

我现在正在尝试这个,但是$ end_month给了我与$ today_month相同的内容:

$today_month = date('m');

$end_month = date('m', strtotime('+31 days', $today_month));

当+ 31天DATE在下一年或我们有闰年时会发生什么?!

有人可以帮助我吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

首先,您的字段必须是no-mysql函数。 所以用planning_month / planning_day替换月/日,因为monthday字是MySQL的功能,如果没有引用它们可能会有错误

这是一个有效的查询。我测试过并且效果很好:

select * from MyTable 
/*CHECK CURRENT YEAR*/
where date(concat(year(now()), planning_month, planning_day)) = 
date(date_add(now(), interval remind_days_before DAY))
OR
/*CHECK NEXT YEAR*/
date(concat(year(date_add(now(), INTERVAL 1 YEAR)), planning_month, planning_day)) = 
date(date_add(now(), interval remind_days_before DAY)) 

<强> Live Example

你的,这对我来说也是一个非常有用的问题

答案 1 :(得分:0)

请检查这两年:

select *
from your_table
cross join (select year(now()) as current_year, year(now())+1 as next_year) vars
where curdate() + interval remind_days_before day = concat(current_year,'-',month,'-',day)
   or curdate() + interval remind_days_before day = concat(   next_year,'-',month,'-',day)