2

我正在尝试使用以下语句检查上个月发生的所有记录。

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

但是,选择不包括最后一天。我想要的是从每月的第一秒到最后一秒。

4

2 回答 2

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'之后,所以不会抓住它。

于 2013-02-01T13:42:41.687 回答
1

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

于 2013-02-01T13:27:26.843 回答