我正在尝试使用以下语句检查上个月发生的所有记录。
Select * from statistics
where statistics_date
BETWEEN date_format(NOW() - INTERVAL 1 MONTH, '%Y-%m-01')
AND last_day(NOW() - INTERVAL 1 MONTH )
但是,选择不包括最后一天。我想要的是从本月的第一个月到本月的最后一个月。
答案 0 :(得分: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之后的,所以之间的将无法捕获它。
答案 1 :(得分:1)
where MONTH(statistics_date) = MONTH(NOW()) - 1