March 8, 2024 - @Cathy https://discord.com/channels/787287985821319186/923174465544785930/1215373775185387560
Hello ici ... J'ai une propriété Date qui sert de plage de date et j'aimerais ressortir combien il y a de dimanche (ou possible avec tout autre jour) dans la plage de dates ... Si c possible ? Svp
Réponse rapide
<aside> <img src="https://prod-files-secure.s3.us-west-2.amazonaws.com/9210293a-6b0f-4638-8e8d-3c40b40ed42b/b8366055-a446-4861-aa67-1e926814ca74/Invisible.png" alt="https://prod-files-secure.s3.us-west-2.amazonaws.com/9210293a-6b0f-4638-8e8d-3c40b40ed42b/b8366055-a446-4861-aa67-1e926814ca74/Invisible.png" width="40px" />
lets(
/* Dénombre le jour de la semaine cible dans une plage de date
By Ouinx2 - 08/03/2024 */
/* Jour de la semaine, de 1 Ă 7 */
jourCible , 7,
/* Rajouter .formatDate("YYYYMMDD").parseDate() si les dates contiennent des heures/minutes */
startDate , prop("Date").dateStart(),
endDate , prop("Date").dateEnd(),
joursEntreDates , endDate.dateBetween(startDate , "days").add(1),
semainesComplètes , joursEntreDates.divide(7).floor(),
joursRestantsEnPlusDesSemainesComplètes , joursEntreDates.subtract(7.multiply(semainesComplètes)),
semainesComplètes.add((joursRestantsEnPlusDesSemainesComplètes > (jourCible.subtract(startDate.day()).add(7).mod(7))).toNumber())
)
<aside> ℹ️ Explication rapide
La formule peut s’utiliser avec des dates comprenant ou non des heures/minutes. Il faut alors la réajuster (cf. commentaires dans la formule).
Le principe repose sur le dénombrement des jours séparant la date de départ de la date de fin, des semaines complètes et des jours séparant le jour cible du jour de départ.
jours séparant la date de départ de la date de fin : endDate.dateBetween(startDate , "days").add(1)
semaines complètes : joursEntreDates.divide(7).floor()
jours séparant le jour cible du jour de départ : jourCible.subtract(startDate.day()).add(7).mod(7))
Les “jours restants en plus des semaines complètes” joursEntreDates.subtract(7.multiply(semainesComplètes)) correspondent au nombre de jours supplémentaires qui ne permettent pas d’avoir une semaine complète. Ils vont donc de 0 à 6.
Comment dénombrer un jour de la semaine cible ?
**semainesComplètes**.add((**joursRestantsEnPlusDesSemainesComplètes** **>** (**jourCible.subtract(startDate.day()).add(7).mod(7))**).toNumber())
S'il y a une semaine complète, il y a forcément le jour cible dedans.
On compte donc d’abord le nombre de semaines complètes.
On y rajoute ensuite +1 s'il y a plus de jours au-delà des semaines complètes (entre 0 et 6) qu'il n'y en a entre le jour cible (non inclus) et le jour de départ.
Par exemple, si le jour de départ est un dimanche et le jour cible est un mercredi, il faut alors 3 jours pour se positionner à la veille du jour cible :
- Si la plage de date s'étend d'un dimanche (jour de départ) à un jeudi , il y aura (en plus d'éventuelles semaines complètes de 7 jours), 5 jours supplémentaires. C'est plus que les 3 jours nécessaires, le jour cible est donc atteint. Le test > est VRAI, ce qui en nombre .toNumber() se traduit par 1.
- Si la plage de date s'étend d'un dimanche (jour de départ) à un mardi , il y aura alors 3 jours supplémentaires. Ces 3 jours permettent de se positionner à la veille du jour cible, mais ne permettent pas de l'atteindre. Le test > est FAUX et vaut donc 0.
Autre écriture : semainesComplètes + (joursRestantsEnPlusDesSemainesComplètes > (jourCible - startDate.day() + 7) % 7).toNumber()
Version All-In-One sans variable : prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).divide(7).floor().add((prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).subtract(7.multiply(prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).divide(7).floor())) > (/*Nombre de 1 à 7 → */ 7.subtract(prop("Date").dateStart().day()).add(7).mod(7))).toNumber())
</aside>
</aside>
Réponses avancées :
<aside> <img src="https://prod-files-secure.s3.us-west-2.amazonaws.com/9210293a-6b0f-4638-8e8d-3c40b40ed42b/b8366055-a446-4861-aa67-1e926814ca74/Invisible.png" alt="https://prod-files-secure.s3.us-west-2.amazonaws.com/9210293a-6b0f-4638-8e8d-3c40b40ed42b/b8366055-a446-4861-aa67-1e926814ca74/Invisible.png" width="40px" />
lets(
/* Dénombre le jour de la semaine cible dans une plage de date
By Ouinx2 - 08/03/2024 */
/* Jour de la semaine, de 1 Ă 7 */
jourCible , 1,
/* Rajouter .formatDate("YYYYMMDD").parseDate() si les dates contiennent des heures/minutes */
startDate , prop("Date").dateStart(),
endDate , prop("Date").dateEnd(),
joursEntreDates , endDate.dateBetween(startDate , "days").add(1),
semainesComplètes , joursEntreDates.divide(7).floor(),
joursRestantsEnPlusDesSemainesComplètes , joursEntreDates.subtract(7.multiply(semainesComplètes)),
**["Lundi", "Mardi" , "Mercredi" , "Jeudi" , "Vendredi" , "Samedi" , "Dimanche"]**
**.map(**
<u>**current</u>.style("u") +**
**"\t" +**
semainesComplètes.add((joursRestantsEnPlusDesSemainesComplètes > ((<u>**index+1)**</u>.subtract(startDate.day()).add(7).mod(7))).toNumber()).style("b,blue")**).join("\t\t")**
)
[1,2,3,4,5].map(prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).divide(7).floor().add((prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).subtract(7.multiply(prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).divide(7).floor())) > (/*Nombre de 1 à 7 → */ current.subtract(prop("Date").dateStart().day()).add(7).mod(7))).toNumber())).sum()
let(cumul,[1,2,3,4,5].map(prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).divide(7).floor().add((prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).subtract(7.multiply(prop("Date").dateEnd().dateBetween(prop("Date").dateStart() , "days").add(1).divide(7).floor())) > (/*Nombre de 1 à 7 → */ current.subtract(prop("Date").dateStart().day()).add(7).mod(7))).toNumber())).sum(),
"Il y a " + cumul + " jour" + (cumul > 1 ? "s" : "") + " allant du lundi au vendredi.")
</aside>
By @Ouinx2 - **Buy me a Beer**