我想通过我的网站运行一个cron作业,这将获取所有在2个月和1天内未激活的电子邮件地址。
我看过这篇文章:
How to select last 6 months from news table using MySQL
所以我知道我想做这样的事情:
SELECT DISTINCT email FROM orders WHERE date = DATE_SUB(now(), INTERVAL 2 MONTH)
额外的一天让我有点陷入困境 - 我是否必须指定这样的天数:
SELECT DISTINCT email FROM orders WHERE date = DATE_SUB(now(), INTERVAL 63 DAYS)
但是后来我担心它们的长度不同(29,30,31),所以它也是一个必须写一个小脚本以检查一个月内的天数然后设置间隔?
可能我这太复杂了所以任何帮助都会受到赞赏!
由于
答案 0 :(得分:5)
INTERVAL
一次只能使用一种类型。有几个“混合”,如HOUR_SECOND
或YEAR_MONTH
,但似乎没有任何MONTH_DAY
混合类型可用于j
个月的间隔和k
天。{/ p>
话虽如此,DATE_ADD
和DATE_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
{1}}表示秒到六位的小数部分(微秒分辨率)。
理解上述内容,天真的解决方案可能是:
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
我可能想知道是否有人打算从一个区间改为另一个区间而只是忘记删除一些代码。但风格选择是你的(最明确的是对你的代码进行评论)。