Този израз -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S)(@) WEEKDAY(@) + WEEKDAY +1
изчислява броя на работните дни между началната дата @S и крайната дата @E.
Предполага се, че крайната дата (@E) не е преди началната дата (@S). Съвместим с DATEDIFF, тъй като една и съща начална и крайна дата дават нула работни дни. Игнорира празниците.
Низът от цифри е конструиран по следния начин. Създайте таблица с начални и крайни дни, като редовете трябва да започват с понеделник (WEEKDAY0), а колоните също трябва да започват с понеделник. Попълнете диагонала отгоре вляво надолу вдясно с всички 0 (т.е. има 0 работни дни между понеделник и понеделник, вторник и вторник и т.н.). За всеки ден започнете от диагонала (винаги трябва да е 0) и попълнете колоните до правилно, ден по ден. Ако кацнете в колона ден за почивни дни (неработен ден), броят на работните дни не се променя, той се пренася отляво. В противен случай броят на работните дни се увеличава с един. Когато стигнете до края на реда, върнете се в началото на същия ред и продължете, докато достигнете отново диагонала. След това преминете към следващия ред.
напр. Ако приемем, че събота и неделя не са работни дни -
<предварителен код> | M T W T F S S-|--------------M| 0 1 2 3 4 4 4T| 4 0 1 2 3 3 3W| 3 4 0 1 2 2 2T| 2 3 4 0 1 1 1F| 1 2 3 4 0 0 0S| 1 2 3 4 5 0 0S| 1 2 3 4 5 5 0След това свържете 49-те стойности в таблицата в низа.
Моля, уведомете ме, ако откриете грешки.
-Редактиране на подобрена таблица:
<предварителен код> | M T W T F S S-|--------------M| 0 1 2 3 4 4 4T| 4 0 1 2 3 3 3W| 3 4 0 1 2 2 2T| 2 3 4 0 1 1 1F| 1 2 3 4 0 0 0S| 0 1 2 3 4 0 0S| 0 1 2 3 4 4 0подобрен низ:'0123444401233334012222340111123400001234000123440'
подобрен израз:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) (@) WEEKDAY(@) + WEEKDAY +1 WEEKDAY>