2013-07-24 154 views
2

我想通过我的网站运行一个cron作业,该作业将从2个月和1天内收集所有尚未激活的电子邮件地址。MySQL在查询中的时间间隔

我已经看到了这个帖子:

How to select last 6 months from news table using MySQL

所以我知道我想要做这样的事情:

SELECT DISTINCT email FROM orders WHERE date = DATE_SUB(now(), INTERVAL 2 MONTH) 

额外的一天是有我有点卡住 - 我必须指定一个这样的天数:

但是然后我关注他们中不同长度的月份(29,30,31),那么是否也必须编写一个小脚本来检查设置间隔之前一个月中的天数?

可能我做这个太复杂,所以任何帮助将不胜感激!

感谢

回答

4

您只能在与INTERVAL一次使用一种类型。有几种“杂种”,如HOUR_SECONDYEAR_MONTH,但似乎没有任何MONTH_DAY混合类型可用,将用于j个月和k天的时间间隔。

这就是说,DATE_ADDDATE_SUB功能存在,使简单的日期算术更具可读性。您仍然可以使用日期计算在更基本的,但不太可读的形式,看一看,当您运行下面的查询会发生什么:

CREATE TEMPORARY TABLE foo (SELECT NOW() a, NOW()+1 b, NOW()+10000000000001 c); 

SELECT * FROM foo; 

DESCRIBE foo; 

您尝试运行之前,不要眯太久第二查询第三。这里发生的事情是,MySQL可以通过几种方式表示一个DATETIME,包括字符串:'YYYY-MM-DD hh:mm:ss',或者等效地表示为双精度数值:YYYYMMDDhhmmss.ffffff其中f表示第二到第六位的小数部分(微秒解析度)。

了解上述情况,天真的解决办法是:

SELECT NOW() - 00000201000000.000000 
      # YYYYMMDDhhmmss.ffffff (format of above) 

然而,即使你代表日期时间,你还在使用一个号码,这样你就不会需要所有这些额外的前导零或空的小数位。你可以这样做,而不是:

SELECT NOW() - 201000000 
      # MDDhhmmss (format of above) 

最后,您可以CAST这个数值结果回DATETIME格式用于查询:

SELECT DISTINCT email FROM orders WHERE date = CAST(NOW() - 201000000 AS DATETIME) 

有几十种其他的方法来做到这一点。我的选择很可能是以下,为便于阅读:

SELECT DISTINCT email FROM orders WHERE date = ((NOW() - INTERVAL 2 MONTH) - INTERVAL 1 DAY) 

不需要在算术表达式中的分组,但我建议至少使用外组括号强调的是,这两个减法之意。就个人而言,如果我看到NOW() - INTERVAL 2 MONTH - INTERVAL 1 DAY,我可能会想知道是否有人打算从一个间隔改变到另一个间隔,而忘记删除一些代码。但风格的选择是你的(而最明确的事情是评论你的代码)。

+0

明智的答案 - 感谢所有的信息! – hlh3406