Calculer la Date de reprise

Résolu/Fermé
@min@ Messages postés 49 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 7 décembre 2011 - 21 sept. 2011 à 13:33
@min@ Messages postés 49 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 7 décembre 2011 - 21 sept. 2011 à 15:09
Bonjour,



j'ai une table congé(ID,année,nbr_jour,dt_cessation,motif)

je veux créer une requete sql qui permet de calculer la date de reprise automatiquement lors de saisir le nombre de jours et la date de cessation du service sachant que les jours weekend(samedi et dimanche) seront annuler lors de calcul(ça veux dire que n'ont peut pas les considérés parmis le nombre de jours que j'ai choisi )

merci d'avance pour vos réponses.

cordialement amina.

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 sept. 2011 à 14:46
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
0
@min@ Messages postés 49 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 7 décembre 2011 3
21 sept. 2011 à 15:09
bon merci Xavier ,
j'ai tester votre code et ça marche bien
merci une autre fois pour votre aide.
A bientot
cordialement
amina
0