次のステートメントを使用して、先月発生したすべてのレコードを確認しようとしています。
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' より後であるため、その間はキャッチされません。