2015-08-14 86 views
2

嘗試各種各樣的事情,但現在空手而歸。我有它運行硬編碼是這樣的:7天前的MYSQL日期時間行嗎?

WHERE (activities.created_at BETWEEN '2015-08-07 00:00:00' 
           AND '2015-08-07 23:59:59.999') 

我只是試圖將其自動化一下,讓我不必每天都去那裏和日期更改爲不管它是什麼4天前。

我最近的測試是:

WHERE (`activities`.`created_at` = CURDATE() - INTERVAL 7 DAY) 

它不是拋出一個錯誤,而是顯示一個空集時,應該有338行顯示。

+1

而錯誤是...? ...我的盲目猜測是使用'now()'而不是'curdate()'...(編輯:除了'='和'BETWEEN'實際上並不等同) – Uueerdo

+0

這應該是MySQL中的有效語法,即使使用'CURDATE()'。請發佈錯誤。 –

+0

什麼是錯誤?除非我們知道發生了什麼,否則我們無法真正提供幫助。 –

回答

3

這應該工作

where date(created_at) = CURDATE() - interval 7 day 

你的問題是,等號兩邊的數據類型是不一樣的。 created_at是日期時間列,而curdate()返回日期。上述語句將created_at轉換爲比較前的日期。

+0

美麗!非常感謝。它看起來像來自Toad for MySQL的額外代碼扔掉了一些東西。 – user1318340

+1

請注意,將函數包裝在函數中會阻止MySQL使用索引範圍掃描操作。這種查詢模式強制MySQL爲表中的每個*行計算'date(created_at)'表達式(或者每行不被其他謂詞排除),並將其與文字進行比較。在大型表上,這會導致對性能的顯着影響,而對於可以有效使用索引的「裸」列中的謂詞的查詢計劃會產生顯着影響。 – spencer7593

+0

@ spencer7593感謝您的信息,我不知道。 – thebjorn

3

我會做這樣的:

WHERE `activities`.`created_at` >= DATE(NOW()) - INTERVAL 7 DAY 
    AND `activities`.`created_at` < DATE(NOW()) - INTERVAL 6 DAY 

使用CURDATE()如果你願意,代替DATE(NOW())

我的偏好是在第二天的「不到」午夜。

只要分辨率降到秒,這就是MySQL DATETIME或TIMESTAMP的含義,做小於或等於時間分量爲「23:59:59」的值就可以正常工作。有些數據庫支持更精確的日期時間值,在SQL Server中最低可達3ms, 「23:59:59.982」。

「不到下一天的午夜」模式適用於比1秒更精確的日期時間值。

+0

這是Aaron Bertrand的博客文章,主張反對在日期時間比較中使用BETWEEN:[http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-魔鬼有功能於common.aspx(http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx ),其中詳細介紹瞭如何使用BETWEEN可能導致意外(和未檢測到)問題的詳細示例。做一個'> ='和一個'''比較可以避免很多這些問題,並且使得作者的意圖非常清楚。 – spencer7593