0

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>');
4

2 に答える 2

1

を使用STR_TO_DATEすると、週の最初と最後の曜日を作成できます。次に、BETWEENまたは日付演算を使用して日付を見つけます。

WHERE dateColumn > STR_TO_DATE('1,5,2012', '%w,%v,%Y') 
               AND dateColumn < STR_TO_DATE('0,5,2012', '%w,%v,%Y')
于 2013-01-16T19:57:08.570 に答える
0

第 5 週の開始日と終了日を割り出し、BETWEEN 演算子に基づいてフィルタリングできます。

SELECT * FROM Table1 WHERE T.Date1 BETWEEN '01-29-2012 00:00:00' AND '02-04-2012 00:00:00'
于 2013-01-16T19:57:46.680 に答える