您只能在與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