Accueil – Le CFO masqué › Forums › Power Query › trouver le nombre de jour ouvré sans les feriés
Mots-clés : power query;power bi
- Ce sujet contient 5 réponses, 3 participants et a été mis à jour pour la dernière fois par Antoine Fixary, le il y a 1 année et 6 mois.
-
AuteurArticles
-
30 janvier 2022 à 17 h 49 min #100995patrickblancseauParticipant
Bonjour j’essais d’associer plusieurs requêtes dans power query
mon but et de compte le nombre de jour ouvré et d’enlevé les ferié
si quelqu’un a une idée je suis preneur
Cordialement–>la premiere trouve les le weekends
(DATE_DEBUT as date, DATE_FIN as date) as number => let Liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN - DATE_DEBUT)+1, #duration(1, 0, 0, 0)), Weekend = List.Select(Liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5), Supprimer_Weekend = List.RemoveItems(Liste_De_Date, Weekend), Nombre_De_Jours = List.Count(Supprimer_Weekend) in Nombre_De_Jours
–>la deuxieme trouve les jours feriés
let Source = (date) => let annee = Date.Year(date), jour = Date.Day(date), mois = Date.Month(date), paques = fnJourPaques(annee), paquesLundi = Date.AddDays(paques, 1), ascension=Date.AddDays(paques, 39), pentecote=Date.AddDays(paques, 49), pentecoteLundi = Date.AddDays(pentecote, 1), estFerié = if (mois=1 and jour=1) then 1 else if (mois=5 and jour=1) then 1 else if (mois=5 and jour=8) then 1 else if (mois=7 and jour=14) then 1 else if (mois=8 and jour=15) then 1 else if (mois=11 and jour=1) then 1 else if (mois=11 and jour=11) then 1 else if (mois=12 and jour=25) then 1 //else if (date = paques) then 1 else if (date = paquesLundi) then 1 else if (date = ascension) then 1 //else if (date = pentecote) then 1 else if (date = pentecoteLundi) then 1 else 0 in estFerié in Source
recherche du jour de paques
let Source = (annee)=> let g = Number.Mod(annee,19), c = Number.IntegerDivide(annee,100), c4 = Number.IntegerDivide(c,4), e=Number.IntegerDivide((8*c+13),25), h=Number.Mod((19*g+ c-c4-e+15),30), h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h, k=Number.IntegerDivide(h2,28), p=Number.IntegerDivide(29,(h2+1)), q=Number.IntegerDivide((21-g),11), i=(k*p*q-1)*k+h2, b=Number.IntegerDivide(annee,4)+annee, j1=b+i+2+c4-c, j2=Number.Mod(j1,7), r=28+i-j2, jourDePaquesSTR="01/03/"&Text.From(annee), jourDePaquesDate = Date.FromText(jourDePaquesSTR), jourDePaques=Date.AddDays(jourDePaquesDate, r-1) in jourDePaques in Source
- Ce sujet a été modifié le il y a 2 années et 8 mois par patrickblancseau.
2 février 2022 à 3 h 50 min #101125Stéphane LorinParticipantBonjour
ça me parait bien compliqué.
Personnellement j’aurai une liste de jour fériés dans une table manuelle (ce sont des données figées, variables suivant les pays/régions)ensuite je préfère sélectionner les jours du lundi au vendredi plutôt que de retirer les WE et ensuite retirer les jours fériés
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
Liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
Hors_Weekend = List.Select(Liste_De_Date, each Date.DayOfWeek(_, Day.Monday) <= 5),
#”Supprimer_Fériés” = List.RemoveItems(Liste_De_Date, Jours_Fériés),
Nombre_De_Jours = List.Count(#”Supprimer_Fériés”)
in
Nombre_De_Jours7 février 2022 à 17 h 54 min #101251patrickblancseauParticipantBonjour stephaen,
j’y avais pensé, mais je me suis dit que cela est encore une table en plus
mais vu la complexité et le temps, j’ai choisis ta solution
merci4 avril 2023 à 10 h 36 min #127168Antoine FixaryParticipantBonjour, je viens après la guerre, mais jamais le même problème et les codes ci*dessus m’ont permis de le résoudre.
Ci-joint, mon humble contribution.
Fonction fnJoursOuvresAnnee
A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :
[code]
// Calcul le nombre de jours ouvrées (hors week-end et jours fériés)(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
annee = Date.Year(DATE_DEBUT),////////////////////////////////
// Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
////////////////////////////////
g = Number.Mod(annee,19),
c = Number.IntegerDivide(annee,100),
c4 = Number.IntegerDivide(c,4),
e=Number.IntegerDivide((8*c+13),25),
h=Number.Mod((19*g+ c-c4-e+15),30),
h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
k=Number.IntegerDivide(h2,28),
p=Number.IntegerDivide(29,(h2+1)),
q=Number.IntegerDivide((21-g),11),
i=(k*p*q-1)*k+h2,
b=Number.IntegerDivide(annee,4)+annee,
j1=b+i+2+c4-c,
j2=Number.Mod(j1,7),
r=28+i-j2,
jourDePaquesSTR=”01/03/”&Text.From(annee),
jourDePaquesDate = Date.FromText(jourDePaquesSTR),
paques=Date.AddDays(jourDePaquesDate, r-1),////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
jourDeLAn = #date(annee,1,1),
paquesVendredi = Date.AddDays(paques, -2),
paquesLundi = Date.AddDays(paques, 1),
feteTravail = #date(annee,5,1),
victoire1945 = #date(annee,5,8),
ascension=Date.AddDays(paques, 39),
pentecote=Date.AddDays(paques, 49),
pentecoteLundi = Date.AddDays(pentecote, 1),
feteNationale = #date(annee,7,14),
assomption = #date(annee,8,15),
toussaint = #date(annee,11,1),
armistice1918 = #date(annee,11,11),
noel = #date(annee,12,25),
saintEtienne = #date(annee,12,26),
joursFeries = {jourDeLAn} & {paquesVendredi} & {paques} & {paquesLundi} & {feteTravail} & {victoire1945} & {ascension} & {pentecote} & {pentecoteLundi} & {feteNationale} & {assomption} & {toussaint} & {armistice1918} & {noel} & {saintEtienne},////////////////////////////////
// Calcul du nombre de jours ouvrés entre 2 dates d’une même année
////////////////////////////////
liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
nombre_De_Jours = List.Count(supprimer_JoursFeriés)
in
nombre_De_Jours
[/code]Fonction fnJoursOuvresMultiAnnee à utliser si la période peut courir sur ou
ans (nécessite fnJoursOuvresAnnee)[code]
// Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
anneeDebut = Date.Year(DATE_DEBUT),
anneeFin = Date.Year(DATE_FIN),
nombre_De_Jours = if anneeFin – anneeDebut = 0 then
fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
else if anneeFin – anneeDebut = 1 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else if anneeFin – anneeDebut = 2 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else
error “Ecart de plus de 2 ans entre les dates”
in
nombre_De_Jours
[/code]Ces codes ne sont pas nécessairement optimisés, mais ils font le job.
Belle journée
5 avril 2023 à 1 h 58 min #127189Antoine FixaryParticipantBonjour,
n’ayant pas trouvé le moyen de modifié mon post précédent, ci-dessous mon code légèrement amélioré.
Si quelqu’un connait la syntaxe pour intégré du code sur ce forum, je suis intéressé, par ce n’est pas du BBcode à priori.
Toujours 2 fonctions en fonction des besoins :
Fonction fnJoursOuvresAnnee – A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :
// Calcul le nombre de jours ouvrées (hors week-end et jours fériés)
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
annee = Date.Year(DATE_DEBUT),////////////////////////////////
// Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
////////////////////////////////
g = Number.Mod(annee,19),
c = Number.IntegerDivide(annee,100),
c4 = Number.IntegerDivide(c,4),
e=Number.IntegerDivide((8*c+13),25),
h=Number.Mod((19*g+ c-c4-e+15),30),
h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
k=Number.IntegerDivide(h2,28),
p=Number.IntegerDivide(29,(h2+1)),
q=Number.IntegerDivide((21-g),11),
i=(k*p*q-1)*k+h2,
b=Number.IntegerDivide(annee,4)+annee,
j1=b+i+2+c4-c,
j2=Number.Mod(j1,7),
r=28+i-j2,
paques=Date.AddDays(#date(annee,3,1), r-1),////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
joursFeries = {#date(annee,1,1), // Jour de l’an
Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
Date.AddDays(paques, 1), // Dimanche de Pâques
#date(annee,5,1), // Fête du travail
#date(annee,5,8), // Victoire 1945
Date.AddDays(paques, 39), // Ascension
Date.AddDays(paques, 49), // Pentecote
Date.AddDays(paques, 50), // Lundi de pentecote
#date(annee,7,14), // Fête nationale
#date(annee,8,15), // Assomption
#date(annee,11,1), // La Toussaint
#date(annee,11,11), // Armistice 1918
#date(annee,12,25), // Noel
#date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle)////////////////////////////////
// Calcul du nombre de jours ouvrés entre 2 dates d’une même année
////////////////////////////////
liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
nombre_De_Jours = List.Count(supprimer_JoursFeriés)
in
nombre_De_JoursFonction fnJoursOuvresMultiAnnee à utiliser si la période peut courir sur 1 ou
2 ans (nécessite fnJoursOuvresAnnee)// Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
anneeDebut = Date.Year(DATE_DEBUT),
anneeFin = Date.Year(DATE_FIN),
nombre_De_Jours = if anneeFin – anneeDebut = 0 then
fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
else if anneeFin – anneeDebut = 1 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else if anneeFin – anneeDebut = 2 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else
error “Ecart de plus de 2 ans entre les dates”
in
nombre_De_JoursBelle journée à tous.
5 avril 2023 à 2 h 48 min #127190Antoine FixaryParticipantEncore une petite coquille (pourquoi on ne peut pas modifier ces posts ?)
Nouveau code à changer pour le calcul du la liste “joursFeries”, erreur mineure pour Pâques :
////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
joursFeries = {#date(annee,1,1), // Jour de l’an
Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
paques, // Dimanche de Pâques
Date.AddDays(paques, 1), // Lundi de Pâques
#date(annee,5,1), // Fête du travail
#date(annee,5,8), // Victoire 1945
Date.AddDays(paques, 39), // Ascension
Date.AddDays(paques, 49), // Pentecote
Date.AddDays(paques, 50), // Lundi de pentecote
#date(annee,7,14), // Fête nationale
#date(annee,8,15), // Assomption
#date(annee,11,1), // La Toussaint
#date(annee,11,11), // Armistice 1918
#date(annee,12,25), // Noel
#date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle) -
AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.