7

次のような「entry_date」と呼ばれる列DATETIMEを持つデータベーステーブルがあります...

ID  entry_date
1   2012-10-13
2   2012-10-14
3   2012-10-15
4   2012-10-20
5   2012-10-20
6   2012-10-21

PHP/MYSQL で DATE に基づいて結果をエコーアウトする最良の方法は何ですか? 今週の結果だけを取得するので、2012-10-15 > 2012-10-21 ですが、明らかにそれをコーディングすることはできません。日は変わるので、毎日 :) php でそれを行うにはどうすればよいでしょうか。明日、今週の条件は 2012-10-16 > 2012-10-22 になります。

4

1 に答える 1

10

今日は、

where date(`entry_date`) = curdate()

今月は、

where month(`entry_date`) = month(curdate()) 
and  year(`entry_date`) = year(curdate()) 

今週は

WHERE `entry_date` 
BETWEEN (CURDATE() - Interval DAYOFWEEK(CURDATE()) day) 
AND (CURDATE() - Interval DAYOFWEEK(CURDATE()) day + Interval 1 week)

上記のクエリは理解に役立ちます。しかし、パフォーマンスの観点からは良くありません。以下の変更されたものを参照してください。そのはるかに優れています。

SET @s:=(CURDATE() - Interval DAYOFWEEK(CURDATE()) day)
SET @e:=(CURDATE() - Interval DAYOFWEEK(CURDATE()) day + Interval 1 week)
SELECT ....  WHERE `entry_date` BETWEEN @s AND @e

ここで DAYOFWEEK 関数は、1 = 日曜日から始まる整数を返します。したがって、週は開始日として土曜日としてカウントされます。月曜日が必要な場合は+ Interval 2 day、Interval を追加します。

以下のように簡略化することもできます。ただし、どの曜日も週の最初の曜日としてサポートされていません。したがって、すべての文化に移植できるわけではありません。

where yearweek(`entry_date`) = yearweek(curdate())
于 2012-10-20T23:12:24.887 に答える