Detta uttryck -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
beräknar antalet arbetsdagar mellan startdatumet @S och slutdatumet @E.
Förutsätter att slutdatum (@E) inte är före startdatum (@S). Kompatibel med DATEDIFF genom att samma startdatum och slutdatum ger noll arbetsdagar. Ignorerar helgdagar.
Siffersträngen är konstruerad enligt följande. Skapa en tabell över startdagar och slutdagar, raderna måste börja med måndag (WEEKDAY0) och kolumnerna måste också börja med måndag. Fyll i diagonalen från övre vänster till nedre höger med alla 0 (dvs. det finns 0 arbetsdagar mellan måndag och måndag, tisdag och tisdag, etc.). Börja med diagonalen för varje dag (måste alltid vara 0) och fyll i kolumnerna till rätt, en dag i taget. Om du landar på kolumnen en helgdag (icke arbetsdag) ändras inte antalet arbetsdagar, det bärs från vänster. Annars ökar antalet arbetsdagar med en. När du når slutet av raden går du tillbaka till början av samma rad och fortsätt tills du når diagonalen igen. Gå sedan vidare till nästa rad.
T.ex. Förutsatt att lördag och söndag inte är arbetsdagar -
| 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
Sammanfoga sedan de 49 värdena i tabellen i strängen.
Meddela mig om du hittar några buggar.
-Redigeringsförbättrad tabell:
| 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
förbättrad sträng:'01234444012333334012222340111123400001234000123440'
förbättrat uttryck:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)