2012 年の第 5 週のすべてのレコードを返したいと考えています。たとえば、次のクエリは正しいレコードを提供しますが、WEEK() と YEAR() を行ごとに計算する必要があり、インデックスを計算できないため、非常に非効率的です。使用済み。BETWEEN を使用する必要があると思いますが、どうすればよいかわかりません。また、特定の月と四半期に同様のことを行う必要があり、理想的には同様のソリューションを使用できます。必要に応じて、SQL を PHP で補うことができます。ありがとう
SELECT * FROM myTable WHERE WEEK(dateColumn)=5 AND YEAR(dateColumn)=2012;
編集 - 以下が補足コメントに追加されました
***テストデータ** *
SELECT * FROM projects_sell WHERE award_date BETWEEN '2012-04-01' AND '2012-04-08'
0.55236601829529
SELECT * FROM projects_sell WHERE YEAR(award_date)=2012 AND WEEK(award_date)=5
0.52925586700439
SELECT * FROM projects_sell WHERE award_date > STR_TO_DATE('1,5,2012', '%w,%v,%Y') AND award_date < STR_TO_DATE('0,5,2012', '%w,%v,%Y')
0.69798302650452
***テストスクリプト** *
//$sql ="SELECT * FROM projects_sell WHERE award_date BETWEEN '2012-04-01' AND '2012-04-08'";
//$sql ="SELECT * FROM projects_sell WHERE YEAR(award_date)=2012 AND WEEK(award_date)=5";
$sql ="SELECT * FROM projects_sell WHERE award_date > STR_TO_DATE('1,5,2012', '%w,%v,%Y') AND award_date < STR_TO_DATE('0,5,2012', '%w,%v,%Y')";
$current_time=microtime(true);
for ($i=1; $i<=1000; $i++)
{
$stmt = db::db()->query($sql);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
echo($sql.'<br>'.(microtime(true)-$current_time).'<br>');