この表現-
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)