2016-01-21 105 views
3

什麼是最有效的方式來獲得與落在00:00:00昨天在23:59:59昨日某處之間的時間字段中的所有記錄所有的MySQL記錄?從昨天

表:

id created_at 
1  2016-01-19 20:03:00 
2  2016-01-19 11:12:05 
3  2016-01-20 03:04:01 

昨天假設是2016年1月19日,那麼在這種情況下,所有我想要返回的行1和2

回答

12

既然你只想找日期部分,你可以比較容易的使用MySQL's DATE() function。請注意,如果您有大量的記錄,這可能是低效率的;索引優勢隨着衍生值DATE()而丟失。

SELECT * FROM table WHERE DATE(created_at) = DATE(NOW() - INTERVAL 1 DAY); 
+0

奇怪的是,只有從今天而不是昨天返回記錄。 – eComEvo

+0

你在什麼時區,以及與數據庫記錄相比如何?我可以向你保證,'SELECT DATE(NOW() - INTERVAL 1 DAY)'將選擇昨天的日期! – miken32

+0

'SELECT @@ global.time_zone,@@ session.time_zone;'只是給了我兩個值的'SYSTEM'。當我檢查數據庫系統上的TZ時,它是UTC,而我的是EST。查詢最終只能從遠程系統上的腳本運行,所以我認爲這應該不是問題。 – eComEvo

1

使用: subdate(current_date, 1)

這對你的情況很棒!

+0

這不會給我任何結果:'選擇MY_TABLE *其中created_at = SUBDATE(CURRENT_DATE,1);'你是怎麼這意味着要在查詢中使用? – eComEvo

+0

'SELECT * FROM MY_TABLE其中created_at> SUBDATE(CURRENT_DATE,1);'' – pivanchy

+0

SELECT * FROM MY_TABLE其中SUBDATE(CURRENT_DATE,1)和CURRENT_DATE之間created_at;'這個查詢將從00:00:00從獲取的所有數據直到昨天00:00:00今天(我的意思是24小時),因爲之前的查詢將返回昨天所有的數據,直到當前時間 – pivanchy

0

您可以使用subdate表示「昨天」,並使用date()來表明您想記錄,即只有列的日期部分匹配。所以:

SELECT * 
FROM tablename 
WHERE DATE(created_at) = SUBDATE(CURRENT_DATE(), INTERVAL 1 DAY) 
1

Here是一個答案相同的問題。總結爲您的答案,使用由Sajmon建議的subdate()

subdate(currentDate, 1) 

使用你的表應該是。

select * 
from tablename 
where created_at between subdate(CURDATE(), 1) 
and date (now()) 
4

,您仍然可以使用索引,如果你說

SELECT * FROM TABLE 
WHERE CREATED_AT >= CURDATE() - INTERVAL 1 DAY 
    AND CREATED_AT < CURDATE();