同様の問題がありました。次のルールに基づいて週番号を計算する必要がありました。
- 週の始まりは金曜日
- 年の残りの日数 (その年の最終金曜日以降で 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 日を 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 を追加しました。