2013-07-24 231 views
2

我想通過我的網站運行一個cron作業,該作業將從2個月和1天內收集所有尚未激活的電子郵件地址。MySQL在查詢中的時間間隔

我已經看到了這個帖子:

How to select last 6 months from news table using MySQL

所以我知道我想要做這樣的事情:

SELECT DISTINCT email FROM orders WHERE date = DATE_SUB(now(), INTERVAL 2 MONTH) 

額外的一天是有我有點卡住 - 我必須指定一個這樣的天數:

但是然後我關注他們中不同長度的月份(29,30,31),那麼是否也必須編寫一個小腳本來檢查設置間隔之前一個月中的天數?

可能我做這個太複雜,所以任何幫助將不勝感激!

感謝

回答

4

您只能在與INTERVAL一次使用一種類型。有幾種「雜種」,如HOUR_SECONDYEAR_MONTH,但似乎沒有任何MONTH_DAY混合類型可用,將用於j個月和k天的時間間隔。

這就是說,DATE_ADDDATE_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,我可能會想知道是否有人打算從一個間隔改變到另一個間隔,而忘記刪除一些代碼。但風格的選擇是你的(而最明確的事情是評論你的代碼)。

+0

明智的答案 - 感謝所有的信息! – hlh3406