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 に答える