Tento výraz -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
vypočítá počet pracovních dnů mezi počátečním datem @S a koncovým datem @E.
Předpokládá, že koncové datum (@E) není před počátečním datem (@S). Kompatibilní s DATEDIFF v tom, že stejné datum zahájení a datum ukončení udává nula pracovních dnů. Ignoruje svátky.
Řetězec číslic je konstruován následovně. Vytvořte tabulku počátečních a koncových dnů, řádky musí začínat pondělím (WEEKDAY0) a sloupce musí také začínat pondělím. Vyplňte úhlopříčku zleva shora dolů doprava všemi 0 (tj. mezi pondělím a pondělím je 0 pracovních dnů, úterý a úterý atd.). Pro každý den začněte na úhlopříčce (musí být vždy 0) a vyplňte sloupce do správně, jeden den po druhém. Pokud se dostanete na sloupec víkendový den (nepracovní den), počet pracovních dnů se nemění, je přenášen zleva. V opačném případě se počet pracovních dnů zvýší o jeden. Když se dostanete na konec řady, vraťte se na začátek stejné řady a pokračujte, dokud se znovu nedostanete na úhlopříčku. Poté přejděte na další řádek.
Např. Za předpokladu, že sobota a neděle nejsou pracovní dny -
| 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
Poté zřetězte 49 hodnot v tabulce do řetězce.
Pokud najdete nějaké chyby, dejte mi prosím vědět.
-Upravit vylepšenou tabulku:
| 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
vylepšený řetězec:'01234444401233334012222340111123400001234000123440'
vylepšený výraz:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)