sql >> データベース >  >> RDS >> Mysql

土曜日から始まる週の1年の週

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

    • 週は金曜日に始まります
    • 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を追加しました。



    1. ASP.NETでC#を使用してデータベースからバイナリイメージを取得する方法

    2. それらは大きなオブジェクトを酷評します

    3. IRIWorkbenchでのデータ分類

    4. インストールされているOracleクライアントが32ビットまたは64ビットであることを知る方法は?