一次只能使用一种类型INTERVAL
。有几个像HOUR_SECOND
or这样的“混合”,YEAR_MONTH
但似乎没有任何MONTH_DAY
混合类型可以用于j
几个月和k
几天的间隔。
话虽如此,DATE_ADD
andDATE_SUB
函数的存在是为了使简单的日期算术更具可读性。您仍然可以以更基本但可读性较差的形式使用日期算术 - 看看运行以下查询时会发生什么:
CREATE TEMPORARY TABLE foo (SELECT NOW() a, NOW()+1 b, NOW()+10000000000001 c);
SELECT * FROM foo;
DESCRIBE foo;
在尝试运行第三个查询之前,不要对第二个查询眯眼太久。这里发生的是 MySQL 可以DATETIME
用几种方式表示 a,包括作为字符串:'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
我可能想知道是否有人打算从一个间隔更改为另一个,只是忘记删除一些代码。但是风格选择是你的(最明确的就是注释你的代码)。