2

現在、土曜、日曜、または月曜のいずれかから始まる週を定義しているお客様がいます。日曜日と月曜日から始まる週を適切に処理するこれらの DATE_FORMAT オプションに出くわしましたが、土曜日から始まる週に対して同じことを行う方法が見つかりません。助言がありますか?

%U    Week (00..53), where Sunday is the first day of the week
%u    Week (00..53), where Monday is the first day of the week
4

3 に答える 3

3

同様の問題がありました。次のルールに基づいて週番号を計算する必要がありました。

  • 週の始まりは金曜日
  • 年の残りの日数 (その年の最終金曜日以降で 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 を追加しました。

于 2013-04-18T12:23:10.073 に答える
2

この質問について考えるのにしばらく時間がかかりました。

ISO 標準は、月曜日から始まる最初の週を定義し、年の 4 日を含みます。MySQL の関数は、より多くの選択肢を提供します。

date_format()フラグ%U%u最初の週が日曜日または月曜日が最初に会った週である表記法を使用しています。これは ISO に準拠していないため、両方のバリエーションを提供します。

土曜日から始まる週番号をカウントしたい場合で、最初の年の週が土曜日を含む週である場合は、次の式のいずれかを使用できます。

SELECT sign(dayofweek(current_date) - 7) + ceil(dayofyear(current_date)/7);
SELECT ceil((dayofyear(current_date)+
            (dayofweek(date_format(current_date, '%Y-01-01'))%7-7))/7);

年の最初の週がその年の 4 日目の週である場合は、次のように使用します。

SELECT ceil((dayofyear(current_date)+
            (dayofweek(date_format(current_date, '%Y-01-04'))%7-4+1))/7);

最初の式は非常に単純です。

2枚目と3枚目について詳しく説明します。私は、今年の現在の日を取り、7 で割り、天井まで上げて、非常に単純な週数を計算します。ただし、年初の状況に応じて週数を調整する必要があります。

  • 最初のケース (最初の週は最初の土曜日から始まります) では、件名にその年の 1 月 1 日の曜日を取り、土曜日を曜日にして0、その差によって曜日を調整します。これにより、最初の土曜日の前のすべての日が負の調整数になり、上限がゼロになります。
  • 2 番目のケース (最初の週は 1 年のうち 4 日が該当する週) の場合、件名に 1 月 4 日を曜日として、土曜日を曜日とし0ます。この-4+1数式は、1 月 4 日より前の最初の土曜日に調整を行います+1。これは、1 年の日付が 0 からではなく 1 から始まるため、使用されます。負の調整は、年の最初の日が年の最初の週にないことを意味します。

SQL Fiddleのテスト日をいくつか示します。

他の日から週を数えたい場合は、数式を変更して、その日を0順番に数えるだけです。たとえば、水曜日から始まる週を数えるには、次を使用します。

SELECT ceil((dayofyear(current_date)+
    ((dayofweek(date_format(current_date, '%Y-01-04'))+3)%7-4+1))/7);

+3dayofweek()水曜日の値を 7に補うために使用されます。

于 2012-05-19T19:00:56.697 に答える
0

に基づいて調整しDAYOFWEEK()ます。

于 2012-05-18T17:58:56.003 に答える