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