同様の問題がありました。次のルールに基づいて週数を計算する必要がありました。
- 週は金曜日に始まります
- 1年の残りの日数(1週間を完了しない、その年の最後の金曜日以降のすべての日)は、翌年の最初の週にカウントする必要があります。
例:
- 2012年12月27日(木曜日)は2012年の第52週である必要があります
- 2012年12月28日(金曜日)は2013年の第1週である必要があります
- 2013年第1週は2012年12月28日から2013年3月1日まで
私は、状況に簡単に適応できるこれらのルールに基づいて、YEARとWEEKNUMBERの両方を計算するこのステートメントを作成しました:
SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)),
IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));
トリッキーな部分はこの表現だけです:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
残り(If句)は、式の結果を適応させて、53週目にyear+1およびweek=1にするためのものです。
できる限り表現を説明しようと思います。次の式は、純粋に単純な週番号を示します(1年の日を1週間の7日で割ったものを切り上げます):
ceil(( dayofyear(current_date))/7)
しかし今、あなたはそれを金曜日(または他の日)に開始させたいと思っています。これを行うには、現在の日に、前年の一部であった最初の週の日を追加する必要があります(最初の週には前年の日が含まれているため、現在は実際には数日前に開始されたようです)。式は、1月1日の平日に基づいてそのオフセットを計算します:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
オフセットは、7と、週を開始する曜日番号の差です。
- 土曜日は0
- 金曜日は1
- 木曜日は2
- 水曜日は3...
したがって、これを前の式に追加するだけで、任意の平日から始まる週番号を計算し、第1週が前年から始まると仮定する上記の式が得られます。
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
次に、53週を1週に変換するIFを追加し、53週の場合は1を年に追加するIFを追加しました。