Code calendrier sous pl/SQL

foloyo3 Messages postés 2 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 26 octobre 2008 - 26 oct. 2008 à 13:33
yvk92 Messages postés 1 Date d'inscription vendredi 29 octobre 2010 Statut Membre Dernière intervention 29 octobre 2010 - 29 oct. 2010 à 11:23
bonjour tout le monde ,

je veux avaoir un code sous pl/SQL qui permet de creer un calendrier.

merci;

1 réponse

yvk92 Messages postés 1 Date d'inscription vendredi 29 octobre 2010 Statut Membre Dernière intervention 29 octobre 2010
29 oct. 2010 à 11:23
Réponse tardive mais ça peut servir à d'autre :

Le code ci-dessous permet de générer une liste de date jour par jour comprises dans un intervale. L'exemple prend une année civile mais les date peuvent être "variabilisées" dans une fonction...

SELECT to_date('01/01/2010','DD/MM/YYYY') + level - 1 AS dy FROM dual
connect BY level <= to_date('31/12/2010','DD/MM/YYYY') - to_date('01/01/2010','DD/MM/YYYY') + 1

Supprimer les jours ouvrés à cela pourrait se faire en ajoutant un "Minus" au code précédent. L'exemple ci-après prend les jour 6 et 7 comme non ouvrés (samedi et dimanche) - mais ça pourrait ausi être variabilisé. Ca ferait donc :

Minus
SELECT to_date('01/01/2010','DD/MM/YYYY') + level - 1 AS dy FROM dual
where to_char(to_date('01/01/2010','DD/MM/YYYY') + level -1, 'D') in ('6','7')
connect BY level <= to_date('31/12/2010','DD/MM/YYYY') - to_date('01/01/2010','DD/MM/YYYY') + 1))

De là à retrancher les jours fériés, il n'y a qu'un petit effort supplémentaire à faire...
Pour les jours fériés, ils sont tous fixes en France sauf 3 qui sont mobiles selon l'année... La liste à établir est donc facile pour les fixes... Il suffit d'ajouter à l'ensemble des jours 6 et 7 (les non ouvrés) les dates fixes comme suit :

union
(select to_date('01/01/'||annee,'DD/MM/YYYY') as dy from dual
union
select to_date('14/07/'||annee,'DD/MM/YYYY') as dy from dual
union
select to_date('15/08/'||annee,'DD/MM/YYYY') as dy from dual
union
select to_date('01/11/'||annee,'DD/MM/YYYY') as dy from dual
union
select to_date('11/11/'||annee,'DD/MM/YYYY') as dy from dual
union
select to_date('25/12/'||annee,'DD/MM/YYYY') as dy from dual

Les 3 jours fériés mobiles sont : Paques, l'ascension et la pentecote...
L'ascension est 38 jours après Paques. La pentecote est 49 jours après Paques. Tout revient donc à déterminer Paques. Je vous suggère donc d'aller voir la page wikipedia lié à Paques... Divers algorithmes de calcul y sont décrit. L'algorithme de Oudin semble être le plus facile à mettre en oeuvre.

Bon, histoire de vous laisser un peu de boulot, je vous laisse implémenter les fonctions Lundi_Paques(annee), Jeudi_Ascension(annee) et Lundi_Pentecote(annee).
0
Rejoignez-nous