Bonjour,
Avant toute considération algorithmique, il faut savoir que les calculs sur les dates
dépendent fortement du SGBD. Donc il faut que tu nous dises si tu es sous Oracle, DB2, MySQL, SQL Server...
L'algorithme lui-même n'est pas trop compliqué tant qu'on ne prend pas en considération les jours fériés.
En gros, pour chaque tranche de 5 jours de congés pris, on ajoute 7 jours à la date de début. Le nombre de tranches de 5 jours est le quotient de la division euclidienne du nombre de jours par 5 : (nbr_jour/5)*7
Il reste alors les quelques derniers jours, que l'on trouve par le reste de la même division : (nbr_jour%5). Là, tout va dépendre du jour de début de prise des congés : si jourDébut + reste < samedi, tout va bien. Sinon, on rajoute deux.
En SQL Server, on connaît le jour de début des congés dans la semaine par la fonction datepart(dw, '2011-09-19') qui donne :
Dimanche -> 1
Lundi -> 2
Mardi -> 3
...
Donc si DatePart(dw, dateDebut) + Reste <= 6, le résultat est (dateDebut + (nbr_jour/5)*7 + Reste).
Sinon, le résultat est (dateDebut + (nbr_jour/5)*7 + Reste + 2).
D'où la requête finale, que j'écris pour SQL Server :
SELECT
CASE
WHEN DATEPART(dw, dt_cessation) + (nbr_jour % 5) <= 6 THEN DATEADD(dd, (nbr_jour / 5) * 7 + (nbr_jour % 5), dt_cessation)
ELSE DATEADD(dd, (nbr_jour / 5) * 7 + (nbr_jour % 5) + 2, dt_cessation)
END
FROM congé
Les quelques tests que j'ai fait me donnent, pour une prise de congés aujourd'hui (21/09)
- 15 jours => 12/10
- 17 jours => 14/10
- 18 jours => 17/10
Xavier