2017-02-02 23 views
1

我有一个MySQL表有以下栏目:如何使这个时间窗口查询?

id, month, day, remind_days_before 

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

我现在有这个权利很努力,但在$ END_MONTH是给我一样的$ today_month:

$today_month = date('m'); 

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

当31天日期是明年或者我们会发生什么闰年?!

有人可以帮我吗?

非常感谢。

+0

嗯,我想给它一个测试,并找出 – RiggsFolly

+0

是你问一个查询,可以从用户输入的文本中提取“15天前”?或者用户文本如何翻译成实际时间? –

+0

我不明白你的问题......你是什么意思的“用户文本”? – VORiAND

回答

1

首先,你的字段必须是一个没有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

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

+0

一个小问题:如果我的planning_month和planning_day列的值不是VARCHAR,那么如何修改查询...? – VORiAND

+0

好吧,我想出了自己:) LPAD(planning_month,2,'0')和LPAD(planning_day,2,'0') – VORiAND

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)