2012-09-06 32 views
7

直到今天,當我使用MySQL並需要使用日期/時間執行操作時,我使用的是具有unix時間戳的int列,並且沒有問題,但今天閱讀了一些指南後,我決定測試時間戳列默認爲「current_timestamp」。MySQL根據current_timestamp選擇上個月的數據

因此,我很感興趣如何選擇上個月的數據列的信息是在「2012-09-07 00:23:30」格式?也許有一些棘手的疑問,從本月開始會給我什麼數據(不是最近30天,而是從09-01 00:00:00到今天)?

+0

不久前我遇到了類似的問題,最終通過服務器端語言計算日期(在這種情況下,PHP,但任何將允許你這樣做)。無論如何,也對此感興趣:) – jribeiro

+0

@jribeiro發表了一個答案,看看。 – Ariel

回答

17

這會給你的最後一個月:

WHERE dateColumn BETWEEN SUBDATE(CURDATE(), INTERVAL 1 MONTH) AND NOW(); 

這從本月開始:

WHERE dateColumn BETWEEN STR_TO_DATE('2012-09-01', '%Y-%m-%d') AND NOW(); 

之間是沒有什麼特別的,它只是

dateColumn <= ... AND dateColumn >= .... 
快捷方式

嗯,我猜NOW()比較實際上並不需要,因爲所有的記錄都會在現在。

所以只是做:

WHERE dateColumn >= STR_TO_DATE('2012-09-01', '%Y-%m-%d') 

當月的動態啓動:

WHERE dateColumn >= CURDATE() - INTERVAL DAY(CURDATE())-1 DAY 

這一切確實是從當前日期中提取月份的一天,然後減去了好些日子少一個從中。

+0

我看到的問題是如果查詢需要動態。我這樣做,但我仍然需要在服務器端找到月份的開始。但也許這超出了OP的要求。 :) – jribeiro

+0

@jribeiro動態是沒有問題的 - 我更新了答案。 – Ariel

3

你應該看看common_schema,很容易安裝,有很多偉大的工具,其中包括一個名爲start_of_month()功能正是你在找什麼:

select * 
from your_table 
where your_column >= common_schema.start_of_month(now()) 
-1

如果你有一個MySQL時間戳,像2013-09-29 22:27:10你可以做到這一點

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

轉換爲UNIX,然後使用UNIX時間函數來提取月份,在這種情況下,9九月份。

+1

更好'選擇*從哪裏MONTH(時間)=(MONTH(NOW()));' – Federico

+0

明年的這個月呢? – Mala

+0

也許從MONT(時間)=(MONTH(NOW()))和YEAR(time)= YEAR(NOW()))表中選擇*。 – Stenyg