2014-02-14 72 views
0

我試圖從上個月選擇所有數據到將來的所有月份。例如,我想選擇從1月到任何可用日期的所有日期未來的數據庫,這是去任何一個月..選擇上一個月,直到今年的未來幾個月從上個月開始選擇所有行

這是我的查詢,它只是從2月開始,我怎麼才能使它開始與上個月..當月 - 1不工作

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
    AND MONTH(event_start_date) = MONTH(CURDATE()) 
+0

你是指在開始日期和結束日期之間? –

+0

爲了獲得最佳性能,我們希望在「event_start_date」列上使用謂詞;這將允許索引範圍掃描(如果有適當的索引可用),而不是讓MySQL評估表中的每一行。 「訣竅」提出了使用當前日期時間並返回前一個月的第一天的表達式,例如, 'event_start_date> = DATE_FORMAT(NOW()+ INTERVAL -1 MONTH,'%Y-%m-01')' – spencer7593

回答

0

使用DATE_SUB()選擇較上月>=選擇中的所有數據未來:

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
    AND MONTH(event_start_date) >= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) 
0

嘗試:

AND MONTH(event_start_date) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS)) 

部分DATE_SUB(CURDATE(), INTERVAL 1 MONTH)將減去一個月從當前日期。如果你想要上個月和將來的一切,請使用:

AND MONTH(event_start_date) >= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS)) 

注意'> ='。儘管1月份有一個邊緣案例,你必須避開。最好的辦法可能是這樣的:

WHERE event_start_date >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS), (DAYOFMONTH(CURDATE)) DAYS) 

哪一個會從上個月的第一個月給你。沒有邊緣情況。

+0

因爲他只選擇特定年份,所以邊緣情況不會成爲問題。 –

+1

如果他想得到上個月,從去年開始,這確實是一個重要的邊緣案例。 –

+0

在這種情況下,'YEAR(event_start_date)= YEAR(CURDATE())'不允許他從去年選擇任何東西。 –

0

試試這個

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
AND MONTH(event_start_date) >= MONTH(CURDATE() - INTERVAL 1 MONTH); 
0
SELECT * 
FROM events 
WHERE event_start_date >= '1/'+MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))+'/'+YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) 
0

出於性能考慮,你很可能要在event_start_date列的索引範圍掃描操作。這意味着(顯然),你想要一個索引event_start_date作爲主要專欄。

要獲得索引範圍掃描,謂詞需要位於裸露的event_start_date列中,而不是函數。

WHERE event_start_date >= some_value 

對於在這種情況下,「SOME_VALUE」,一個可能的表達,你可以使用將是:

CAST(DATE_FORMAT(NOW()+INTERVAL -1 MONTH ,'%Y-%m-01') AS DATE) 

這需要當前的日期和時間,減去1個月,然後設置日期和時間組件到本月的第一個午夜。