14

誰かが私にこれらの2つが異なる結果を与える理由を親切に説明できますか?

これをPHPで実行します。

date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312

そしてこれをMySQLで実行すると

SELECT YEARWEEK(now()); // outputs 201311
4

3 に答える 3

37

mysqlYEARWEEK呼び出しでモード3を指定する必要があります。

SELECT YEARWEEK(now(),3); 

PHPdate()プレースホルダーは、 ISO8601仕様Wに従って週番号を返します。つまり、週は月曜日(日曜日ではなく)に始まり、その年の最初の週は1番(0ではない)であり、その週は新年の半日以上の最初の週です(したがって、1月である必要があります)。木曜日までに)。MySQL WEEK関数のドキュメントによると、オプションの組み合わせはモード3です。

また、重要であるため、Allesのメモを受け入れられた回答に取り込むこと:プレースホルダーYW一緒にしないでください。ISOの週番号と一致する年が必要な場合は、のo代わりにを使用する必要がありYます。たとえば、2014年12月29日月曜日から始まる週について考えてみます。

date('YW', mktime(0,0,0,12,29,2014));  #=> 201401 : 1st week of 2014??
date('oW', mktime(0,0,0,12,29,2014));  #=> 201501 : better
于 2013-03-22T03:43:47.070 に答える
18

YEARWEEK( '2012-01-01'、3)=> 201152であることに注意してください。一方、PHP "YW"は201252を返します。結果の年は、最初と最後の日付引数の年と異なる場合があります。今年の週。(つまり、YEARWEEKの年は週の月曜日の年であり、計算に使用される日付の年ではありません)。

正しい結果を得るには、次のことを行う必要があります

date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152

「o」はその週が属する年を示します。

これがお役に立てば幸いです。

于 2013-03-24T23:32:45.813 に答える
3

YEARWEEK週の範囲[0-53]または[1-53]を指定する2番目の(オプションの)パラメーターを取ります。

この関数は、日付の週番号を返します。WEEK()の2つの引数形式を使用すると、週が日曜日と月曜日のどちらで始まるか、および戻り値を0から53または1から53の範囲にするかどうかを指定できます。mode引数を省略した場合、値default_week_formatシステム変数のが使用されます。

whiledate(W)は、常に[01-53]の範囲にあるISO8601の日付です。したがって、私の推測では、デフォルトでYEARWEEKは[0-53]の範囲を使用しています。

したがって、同じ結果を取得したい場合は、2番目のパラメータとして1を使用してみてください。YEARWEEK

于 2013-03-22T03:44:44.633 に答える