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

2つの日付の間の稼働日数を見つけるMySQL関数

    この表現-

    5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
    

    開始日@Sから終了日@Eまでの営業日数を計算します。

    終了日(@E)が開始日(@S)より前ではないと想定します。同じ開始日と終了日で営業日がゼロになるという点でDATEDIFFと互換性があります。休日を無視します。

    数字の文字列は次のように構成されます。開始日と終了日のテーブルを作成します。行は月曜日(WEEKDAY0)で始まり、列も月曜日で始まる必要があります。対角線を左上から右下にすべて0で入力します(つまり、月曜日と月曜日、火曜日と火曜日などの間に0営業日があります)。毎日、対角線から開始し(常に0である必要があります)、列に次のように入力します。そうです、一度に1日。週末(営業日以外)の欄に着陸した場合、営業日数は変わらず、左から運ばれます。それ以外の場合、営業日数は1日増加します。行の終わりに到達したら、同じ行の最初にループバックし、それぞれが再び対角線になるまで続けます。次に、次の行に進みます。

    例えば。土曜日と日曜日が営業日ではないと仮定します-

     | M T W T F S S
    -|--------------
    M| 0 1 2 3 4 4 4
    T| 4 0 1 2 3 3 3
    W| 3 4 0 1 2 2 2
    T| 2 3 4 0 1 1 1
    F| 1 2 3 4 0 0 0
    S| 1 2 3 4 5 0 0
    S| 1 2 3 4 5 5 0
    

    次に、テーブル内の49個の値を文字列に連結します。

    バグを見つけたら教えてください。

    -改善されたテーブルの編集:

     | M T W T F S S
    -|--------------
    M| 0 1 2 3 4 4 4
    T| 4 0 1 2 3 3 3
    W| 3 4 0 1 2 2 2
    T| 2 3 4 0 1 1 1
    F| 1 2 3 4 0 0 0
    S| 0 1 2 3 4 0 0
    S| 0 1 2 3 4 4 0
    

    改善された文字列: '0123444401233334012222340111123400001234000123440'

    改善された表現:

    5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
    


    1. MySQLの結果をJSONエンコード

    2. クライアントのNLS_LANGを確認するにはどうすればよいですか?

    3. MariaDB JSON_REMOVE()の説明

    4. group_concatとsqliteで行番号を使用する方法