我想通过我的网站运行一个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),所以是否也需要编写一个小脚本来检查设置间隔之前一个月的天数?
可能我会让这个太复杂,所以任何帮助将不胜感激!
谢谢
解决方法:
您只能使用INTERVAL一次使用一种类型.有几个“混合”,如HOUR_SECOND或YEAR_MONTH,但似乎没有任何MONTH_DAY混合类型可用于j个月和k天的间隔.
话虽如此,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表示秒到六位的微小分数(微秒分辨率).
理解上述内容,天真的解决方案可能是:
SELECT NOW() - 00000201000000.000000
# YYYYMMDDhhmmss.ffffff (format of above)
但是,即使您表示日期时间,您仍然使用数字,因此您不需要所有这些额外的前导零或空小数位.你可以这样做:
SELECT NOW() - 201000000
# MDDhhmmss (format of above)
最后,您可以将此数值结果返回到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)
算术表达式中的分组不是必需的,但我建议至少使用外部括号集来强调两个减法都是预期的.就个人而言,如果我看到现在() – 间隔2个月 – 间隔1天我可能想知道是否有人打算从一个间隔改变到另一个间隔而只是忘记删除一些代码.但风格选择是你的(最明确的是评论你的代码).