2014-02-14 44 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个月,然后设置日期和时间组件到本月的第一个午夜。