2013-01-22 12 views
5

次のクエリがあります。PHPとMySQLの週の相違点

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

はそれが私は今、私は、しかし、それのように私のWHERE句でWEEK(date)=35 AND YEAR(date)=2012を使用したくない2012年の週35内のすべての39件のレコードを取得したい以下のような結果に

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

を生成言いますインデックスを利用しません。代わりに、境界を見つけて条件文を使用したいと考えています。また、丸め誤差が発生する可能性があるため、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 < ?'; 
+0

MySQLはdifferntlyあなたがそれを渡すモードに基づいて週数を処理し、(http://dev.mysql.com/doc/ [週(日付、モード)を参照してください] refman/5.5/en/date-and-time-functions.html#function_week)、システム変数でこのサーバー全体を設定することもできます。 – fiz

+0

39件未満のレコードがありますか?おそらくWHERE条件は 'date <=? 'でなければなりません。 – BellevueBob

+0

@fiz WEEK()がどのように異なったモードを持っていたのか分かりましたが、どのように役立つのか分かりませんでした。 – user1032531

答えて

11

あなたは、MySQLがどのように動作しているかについて、正しい結果が得られる週関連のさまざまなモードがあります。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

それは私の理解PHPの日付ロジックと等価であるモード3、これは数週間は月曜日に始まり、数週間は、1から53の番号が付けられていhttp://en.wikipedia.org/wiki/ISO_week_date

標準ISO週日付があるMySQLのモードです。

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

別の方法として、さまざまな日付範囲や集計(Q1〜Q4、H1〜H2など)で柔軟にクエリを実行する機能が必要な場合や、必要な場合に便利な方法がありますPHPでサポートされている週とは異なる週を使用するのは、MySQLで日付ヘルパー・テーブルを使用することです(データ・ウェアハウス内の日付ディメンション表として使用する場合と同様です)。それはあなたに日付範囲を検索するために参加するための便利なテーブルを与えることができます。このような何かが動作するはずです:

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

+0

ああ、私は近づいていた。私はモード3をチェックアウトします! – user1032531

+0

あなたは男のマイクです!完璧に動作します。 – user1032531