Mysql
 sql >> Base de données >  >> RDS >> Mysql

Fonction MySQL pour trouver le nombre de jours ouvrés entre deux dates

Cette expression -

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

calcule le nombre de jours ouvrables entre la date de début @S et ​​la date de fin @E.

Suppose que la date de fin (@E) n'est pas antérieure à la date de début (@S).Compatible avec DATEDIFF dans la mesure où la même date de début et la même date de fin donnent zéro jour ouvrable.Ignore les jours fériés.

La chaîne de chiffres est construite comme suit. Créez un tableau des jours de début et des jours de fin, les lignes doivent commencer par lundi (WEEKDAY0) et les colonnes doivent également commencer par lundi. Remplissez la diagonale du haut à gauche vers le bas à droite avec tous les 0 (c'est-à-dire qu'il y a 0 jours ouvrables entre le lundi et le lundi, le mardi et le mardi, etc.). Pour chaque jour, commencez par la diagonale (doit toujours être 0) et remplissez les colonnes jusqu'au bien, un jour à la fois. Si vous atterrissez sur une colonne de jours de week-end (non ouvrés), le nombre de jours ouvrés ne change pas, il est reporté à partir de la gauche. Sinon, le nombre de jours ouvrables augmente de un. Lorsque vous atteignez la fin de la rangée, revenez au début de la même rangée et continuez jusqu'à ce que vous atteigniez à nouveau la diagonale. Passez ensuite à la ligne suivante.

Par exemple. En supposant que samedi et dimanche ne sont pas des jours ouvrables -

 | 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

Ensuite, concaténez les 49 valeurs du tableau dans la chaîne.

N'hésitez pas à me faire savoir si vous trouvez des bogues.

-Modifier le tableau amélioré :

 | 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

chaîne améliorée :'0123444401233334012222340111123400001234000123440'

expression améliorée :

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)