5

次のクエリがあります。

SELECT COUNT(*), WEEK(date), YEAR(date) FROM myTable GROUP ON YEAR(date), WEEK(date)

次の結果が生成されるとします

32 33 2012
43 34 2012
39 35 2012
17 36 2012

2012 年の第 35 週に 39 件のレコードすべてを取得したいと考えています。ただし、WEEK(date)=35 AND YEAR(date)=2012インデックスを使用しないため、WHERE 句では使用したくありません。代わりに、境界を見つけて条件を使用したいと考えています。丸め誤差が発生する可能性があるため、BETWEEN も使用したくありません。

したがって、私はすべてが良いと考えて次のことを試みますが、39 レコードを取得しません。明らかに、MySQL と PHP では、週の扱いが異なります。MySQL WEEK() がモード 0、2、4、および 6 を使用していることがわかります。これらはすべて、日曜日から始まる週を返します。理想的には、人々が最も一般的に使用するものを用意します。最も重要なことは、DateTime が提供するものと同じであることです。どうすればいいですか?ありがとうございました

$w=35;$y=2012;   //Given
$w=sprintf('%02d',$w);    //Make sure it is two digits
$date = new DateTime($y.'W'.$w);
$d1=$date->format('Y-m-d');
$date->add(new DateInterval('P1W'));
$d2=$date->format('Y-m-d');
$sql='SELECT * FROM myTable WHERE date >= ? AND date < ?';
4

1 に答える 1

12

MySQL がどのように動作するかに関して正しい軌道に乗っており、異なる結果を生成できる週に関連する関数のさまざまなモードがあります。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

PHPの日付ロジックに相当するMySQLモードはモード3であり、ISOの週の日付標準http://en.wikipedia.org/wiki/ISO_week_dateであると私は理解しています

これには、月曜日から始まる週と、1 ~ 53 の週があります。

WEEK(date_field, 3)したがって、PHP 互換の値を取得するには、 を使用する必要があります。

別のアプローチとして、さまざまな日付範囲または集計 (Q1 ~ Q4、H1 ~ H2 など) に対して柔軟にクエリを実行する機能が必要な場合、または別の週を使用する必要がある場合に役立つことがわかりました。 PHP がサポートするのは、MySQL で日付ヘルパー テーブルを使用することです (慣れている場合は、データ ウェアハウスで日付ディメンション テーブルとして使用できるものと同様です)。日付範囲を検索するために結合するのに便利なテーブルを提供できます。このようなものが動作するはずです:

http://databobjr.blogspot.com/2012/06/create-date-dimension-table-in-mysql.html

于 2013-01-23T00:01:10.327 に答える