您只能在与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)
最后,您可以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
,我可能会想知道是否有人打算从一个间隔改变到另一个间隔,而忘记删除一些代码。但风格的选择是你的(而最明确的事情是评论你的代码)。
来源
2013-08-19 17:16:26
Air
明智的答案 - 感谢所有的信息! – hlh3406