web-dev-qa-db-ja.com

SQLのタイムスタンプから、今日、昨日、今週、今月、2つの日付の間のレコードを選択しますphp mysql

うまくいけば、それは簡単な解決策ですが、私は次のデータをフィルタリングしようとしています:-

  • 今日
  • 昨日
  • 今週
  • 今月
  • 2つの日付の間。

データベースから取得する日付は、基本的にタイムスタンプです。

これは私が試したものです:-

  • 今日

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 1 DAY)
    
  • 昨日

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 7 DAYS)
    

...

それは本当に機能していません。

何か案が?

17
Steve

日付のみで選択する場合は、CURDATE(日付と時刻を返す)ではなく、NOW(日付のみを返す)に基づいて計算を行います。これらの例は、日の範囲内のすべての時間をキャッチします。

  • 今日:WHERE timestamp >= CURDATE()
  • 昨日:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • 今月:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • 2013年6月3日から2013年6月7日の2つの日付の間(終了日が6月7日ではなく6月8日として指定されていることに注意してください):_WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'_

「今週」は、週の開始日によって異なります。それはあなたにお任せします。 DAYOFWEEK 関数を使用して、CURDATE()を適切な範囲に調整できます。


補遺:OPの列タイプはINTEGERで、UNIXタイムスタンプを保存し、私の答えは列タイプがTIMESTAMPであると仮定しました。 UNIXタイムスタンプ値を使用して同じことをすべて行い、列にインデックスが付けられている場合でも最適化を維持する方法は次のとおりです(TIMESTAMP列にインデックスが付けられている場合は上記の回答と同様)...

基本的に、解決策は、開始および/または終了日を _UNIX_TIMESTAMP_ 関数でラップするだけです:

  • 今日:WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • 昨日:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • 今月:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • 2013年6月3日から2013年6月7日の2つの日付の間(終了日が6月7日ではなく6月8日として指定されていることに注意してください):WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')
53
Ed Gibbs