To wyrażenie -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
oblicza liczbę dni roboczych między datą rozpoczęcia @S a datą zakończenia @E.
Zakłada, że data zakończenia (@E) nie jest wcześniejsza niż data rozpoczęcia (@S).Zgodny z DATEDIFF, ponieważ ta sama data rozpoczęcia i data zakończenia daje zero dni roboczych.Ignoruje święta.
Ciąg cyfr jest skonstruowany w następujący sposób. Utwórz tabelę dni rozpoczęcia i dni zakończenia, wiersze muszą zaczynać się od poniedziałku (WEEKDAY0), a kolumny również od poniedziałku. Wypełnij przekątną od lewego górnego do dolnego prawego rogu wszystkimi 0 (tzn. między poniedziałkiem a poniedziałkiem, wtorkiem a wtorkiem itd. jest 0 dni roboczych). prawda, jeden dzień na raz. Jeśli wylądujesz w kolumnie z dniami weekendu (poza dniem roboczym), liczba dni roboczych nie ulega zmianie, jest przenoszona od lewej. W przeciwnym razie liczba dni roboczych wzrasta o jeden. Kiedy dojdziesz do końca pętli, wróć do początku tego samego rzędu i kontynuuj, aż ponownie dotrzesz do przekątnej. Następnie przejdź do następnego rzędu.
Np. Zakładając, że sobota i niedziela nie są dniami roboczymi -
| 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
Następnie połącz 49 wartości z tabeli w łańcuch.
Daj mi znać, jeśli znajdziesz jakieś błędy.
- Ulepszona tabela:
| 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
poprawiony ciąg:'0123444401233334012222340111123400001234000123440'
ulepszona ekspresja:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)