うまくいけば、それは簡単な解決策ですが、私は次のデータをフィルタリングしようとしています:-
データベースから取得する日付は、基本的にタイムスタンプです。
これは私が試したものです:-
今日
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)
...
それは本当に機能していません。
何か案が?
日付のみで選択する場合は、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)
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))
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')