Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/09/2011, 14h05   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Par défaut Calcul jours fériés

Bonjour à tous.
J'ai implémenter une procedure reposant sur l'algo de OUDIN afin définir les jours fériés pour l'année en cours.
Pour 2012 et 2013 elle marche très bien MAIS pour l'année 2011, les jours fériés sont décalés d'UN jour.
J'ai tourné le problème dans tous les sens, je n'arrive pas à voir d'où cela peut-il bien venir !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
DELIMITER |
CREATE PROCEDURE JourFerie()
BEGIN     
DECLARE an INT;
DECLARE G INT;
DECLARE C INT;
DECLARE C_4 INT;
DECLARE E INT;
DECLARE H INT;
DECLARE K INT;
DECLARE P INT;
DECLARE Q INT;
DECLARE I INT;
DECLARE B INT;
DECLARE J1 INT;
DECLARE J2 INT;
DECLARE R INT;
DECLARE DimPaque DATETIME;     
DECLARE LunPaque DATETIME;     
DECLARE JeuAscension DATETIME;     
DECLARE LunPentecote DATETIME;   
DECLARE NouvelAn DATETIME;  
DECLARE FeteTravail DATETIME;   
DECLARE Armistice3945 DATETIME;   
DECLARE Assomption DATETIME; 
DECLARE Armistice1418 DATETIME;   
DECLARE FeteNationale DATETIME;   
DECLARE ToussaINT DATETIME; 
DECLARE Noel DATETIME;  
 
SET an = YEAR(CURDATE());    
SET G = an % 19;
SET C = an / 100;
SET C_4 = C / 4;
SET E = (8 * C + 13)/25;
SET H = (19 * G + C - C_4 - E + 15) % 30;
SET K = H / 28;
SET P = 29 / (H + 1);
SET Q = (21 - G)/11;
SET I = (K * P * Q - 1) * K + H;
SET B = (an / 4) + an;
SET J1 = (B + I + 2 + C_4) - C;
SET J2 = J1 % 7;
SET R = 28 + I - J2;
IF(R > 31) THEN
SET DimPaque = CAST(CONCAT(CAST(an AS CHAR) , '-04-' , cast((R-31) AS CHAR)) AS DATETIME);
ELSE
SET DimPaque = CAST(CONCAT(CAST(an AS CHAR) , '-03-' , cast(R AS CHAR)) AS DATETIME);
END IF;
 
-- Jours fériés mobiles      
 
SET LunPaque = ADDDATE(DimPaque,INTERVAL 1 DAY);
SET JeuAscension = ADDDATE(DimPaque,INTERVAL 39 DAY);      
SET LunPentecote = ADDDATE(DimPaque,INTERVAL 50 DAY);      
 
-- Jours fériés fixes      
 
SET NouvelAn = cast(CONCAT(cast(an AS CHAR),'-01-01 00:00:00') AS DATETIME);      
SET FeteTravail = cast(CONCAT(cast(an AS CHAR),'-05-01 00:00:00') AS DATETIME);      
SET Armistice3945 = cast(CONCAT(cast(an AS CHAR),'-05-08 00:00:00') AS DATETIME);      
SET Assomption = cast(CONCAT(cast(an AS CHAR),'-08-15 00:00:00') AS DATETIME);      
SET Armistice1418 = cast(CONCAT(cast(an AS CHAR),'-11-11 00:00:00') AS DATETIME);      
SET FeteNationale = cast(CONCAT(cast(an AS CHAR),'-07-14 00:00:00') AS DATETIME);      
SET ToussaINT = cast(CONCAT(cast(an AS CHAR),'-11-01 00:00:00') AS DATETIME);      
SET Noel = cast(CONCAT(cast(an AS CHAR),'-12-25 00:00:00') AS DATETIME);      
 
INSERT  INTO JoursFeries (JourDate, JoURLabel, JourChome)  
SELECT  DimPaque, 'Dimanche de Pâques', 0    
UNION 
SELECT  LunPaque, 'Lundi de Pâques', 0  
UNION 
SELECT  JeuAscension, 'Jeudi de l''Ascension', 1    
UNION   
SELECT  LunPentecote, 'Lundi de Pentecôte', 1    
UNION 
SELECT  NouvelAn, 'Nouvel an', 1    
UNION 
SELECT  FeteTravail, 'Fête du travail', 1   
UNION   
SELECT  Armistice3945, 'Armistice 39-45', 1   
UNION  
SELECT  Assomption, 'Assomption', 1   
UNION 
SELECT  FeteNationale, 'Fête Nationale', 1   
UNION 
SELECT  ToussaINT, 'Toussaint', 1   
UNION 
SELECT  Armistice1418, 'Armistice 14-18', 1    
UNION 
SELECT  Noel, 'Noël', 0;  
 
END|
DELIMITER ;
Si quelqu'un trouve une solution, je suis preneur...
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 14h13   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Peut-être trouverez-vous une piste dans l'article de SQLPro sur le sujet de la gestion du temps.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 16h26   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Tout d'abord, merci de votre réponse.
J'ai consulté le lien que vous m'avez donné, mais malheureusement je n'ai pas trouvé de réponse à ma question.
Ça doit vraiment se jouer à un cheveu, car la fonction marche très bien pour l'année 2012 et 2013.
Pour 2011 et 2014, le Dimanche de Pâques est calculé un jour trop tôt...
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 19h15   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Aucune solution ?
C'est dommage, je suis sûr que cette procédure mySQL pourrait servir à beaucoup de monde.
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 16h12   #5
Membre régulier
 
Homme Julien SIMON
Ingénieur systèmes et réseaux
Inscription : février 2006
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Julien SIMON
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Transports

Informations forums :
Inscription : février 2006
Messages : 100
Points : 99
Points : 99
Bonjour,

Je suis tombé sur cette procédure en PGPLSQL qui devrait vous permettre de corriger l'erreur :

blog.guillaume.lelarge.info/index.php/post/2006/02/07/431-vacances-en-pl-pgsql
MightyDucks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 17h01   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Bonjour,

malheureusement j'ai sensiblement fait la même démarche que sur le lien que vous m'avez envoyé.

L'algo de Oudin est appliqué texto dans mon script, donc je ne comprend pas comment pour les années 2011 et 2014, le résultat est décalé d'UN jour.

(Ce n'est même pas une histoire d'année bissextile, car 2012 et 2013 marchent très bien, sachant qu'un des deux est bissextile.)
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 14h02   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
C'est sans doute à cause de l'imprécision de vos calculs.
En effet suivant le type SQL de données que vous utilisez, quelques minutes par ci, par là en plus ou en moins peuvent faire basculer la date d'une journée.

Pour ma part, sous MS SQL Server, je me sers des procédures que j'ai écrites et qui me donnent des résultats exacts.
Mais MySQL est bien loin d'égaler MS SQL Server, d'autant qu'il utilise des types de données spécifiques qui n'existent nullement dans la norme SQL...

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 14h41   #8
Membre régulier
 
Homme Julien SIMON
Ingénieur systèmes et réseaux
Inscription : février 2006
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Julien SIMON
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Transports

Informations forums :
Inscription : février 2006
Messages : 100
Points : 99
Points : 99
Même avis que SQLPro, ayant testé sous mysql et postgresql (pas eu le temps sur SQL Server) il y a bien un écart... Celui-ci se retrouve dans plusieurs fonctions de calculs qui me pousse aujourd'hui à migrer mes bases vers postgresql (marre de vérifier l’invérifiable !)
MightyDucks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h26   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Je me doutais que c'était une question de calcul, mais merci à vous pour la confirmation.

Cependant mon patron voulant absolument mySQL, je me retrouve un peu roulé.

Tant pis, ce sera une table de jours fériés en dur pour les 15 prochaines années alors.
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h32   #10
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Citation:
Envoyé par Logarithmix Voir le message
Cependant mon patron voulant absolument mySQL, je me retrouve un peu roulé.
C'est dommage d'utiliser un produit commercial, payant et franchement pas terrible (c'est même pas un vrai SGBDR - à lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/) alors qu'il en existe d'excellent et réellement gratuit, car pas commercial...comme PostGreSQL !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 05h26   #11
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 870
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 870
Points : 1 355
Points : 1 355
salut,

un truc qui peut te sauver est de t'assurer de travailler sur du float (en mettant les littéraux comme 19 à 19.0 par exemple) et de forcer la conversion float vers entier en jouant avec les fonctions d'arrondi dans ta procédure stocker...

si ça peut t'éviter de générer tes 15 prochaines années à la main
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h35.


 
 
 
 
Partenaires

Hébergement Web