2013-02-01 34 views
2

我正在嘗試使用以下語句檢查上個月發生的所有記錄。mySQL - 上個月的全部

Select * from statistics 
where statistics_date 
BETWEEN date_format(NOW() - INTERVAL 1 MONTH, '%Y-%m-01') 
AND last_day(NOW() - INTERVAL 1 MONTH) 

但是,選擇不包括最後一天。我想要的是從本月的第一秒到本月的最後一秒。

回答

7

BETWEEN是日期和時間戳記的工作出了名的壞,因爲它得到的結束日期是錯誤的。

這裏有您需要什麼:

首先,讓我們來計算,即當前月的第一天。你完全正確。

DATE_FORMAT(NOW(),'%Y-%m-01') 

接下來,讓我們來計算最後一個月的第一天:

DATE_FORMAT(NOW(),'%Y-%m-01') - INTERVAL 1 MONTH 

現在,我們選擇在於在區間的記錄。

Select * 
    from statistics 
where statistics_date >= DATE_FORMAT(NOW(),'%Y-%m-01') - INTERVAL 1 MONTH 
    and statistics_date < DATE_FORMAT(NOW(),'%Y-%m-01') 

你怎麼看日期範圍的開始選擇與>=<結束了嗎?您是否看到我在本月的第一天是如何在日期範圍結束時使用的?這些事情很重要,因爲時間戳可以有幾天和幾天的時間。考慮時間戳'2013-01-31 23:58'。這恰好是之後'2012-01-31'所以之間不會捕捉它。

0

where MONTH(statistics_date) = MONTH(NOW()) - 1

+0

這隻考慮同一個月,但不是同一年。 – Augusto

+1

'ang on。這項工作在二月份,但不在一月份。它也適用於多年數據集。因此downvote。 –

+1

你是對的。哎呀,對不起 – paul