Questa espressione -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
calcola il numero di giorni lavorativi tra la data di inizio @S e la data di fine @E.
Presuppone che la data di fine (@E) non sia anteriore alla data di inizio (@S).Compatibile con DATEDIFF in quanto la stessa data di inizio e la stessa data di fine danno zero giorni lavorativi.Ignora le festività.
La stringa di cifre è costruita come segue. Crea una tabella dei giorni di inizio e di fine, le righe devono iniziare con lunedì (WEEKDAY0) e anche le colonne devono iniziare con lunedì. Compila la diagonale da in alto a sinistra in basso a destra con tutto 0 (cioè ci sono 0giorni lavorativi tra lunedì e lunedì, martedì e martedì, ecc.). Per ogni giorno inizia dalla diagonale (deve essere sempre 0) e compila le colonne giusto, un giorno alla volta. Se atterri in una colonna giorno del fine settimana (giorno non lavorativo), il numero di giorni lavorativi non cambia, viene riportato da sinistra. In caso contrario, il numero di giorni lavorativi aumenta di uno. Quando raggiungi la fine della riga, torna all'inizio della stessa riga e continua fino a raggiungere nuovamente la diagonale. Quindi vai alla riga successiva.
Per esempio. Supponendo che sabato e domenica non siano giorni lavorativi -
| 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
Quindi concatena i 49 valori nella tabella nella stringa.
Per favore fatemi sapere se trovate qualche bug.
-Modifica tabella migliorata:
| 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
stringa migliorata:'012344440123333401222223401111123400001234000123440'
espressione migliorata:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)