Problème : À partir d'un champ MySql contenant le code permanent d'un élève, trouver sa date de naissance.

Un code permanent se présente sous cette forme : NNNP########. Les trois première lettres NNN représentent les trois premières lettres du nom de l'élève et la quatrième lettre P représente la première lettre du prénom de l'élève.

Suivent alors 4 paires de nombres.

La première paire représente le jour de la naissance de l'enfant. Cependant, si l'enfant est né après 1999, on lui ajoute 62.
La seconde paire représente le mois de la naissance de l'enfant. Si c'est une fille, on lui ajoute 50.
La troisième paire représente l'année de la naissance.
La quatrième paire est réservée au MELS sans doute pour différencier ceux qui portent à peu près le même nom et sont nés à la même date.

Exemples

ALLN91530111
ALLaire, Nicole.
Les paires sont respectivement : 91, 53, 01, 11.
Puisque 53 > 50, l'enfant est une fille née en mars (53 - 50 = 3 = mars);
01 indique qu'elle est née en 2001;
Puisque qu'elle est née après 1999, le jour de sa naissance est le 29 (91-62).
La dernière paire (11) n'intervient pas dans la DDN.
Sa date de naissance est 2001-03-29.

ROBW24079902
ROBinson, Will.
Les paires sont respectivement : 24, 07, 99 et 12.
07 indique le mois de juillet. C'est un garçon car le nombre est plus petit que 50.
99 indique qu'il est né en 1999.
24 est son jour de naissance. Il est plus petit que 62 car l'enfant est né avant 2000.
Le nombre 12 n'a pas de signification au regard de la DDN.
La date de naissance de Will est : 1999-07-24.

Le code SQL qui permet la transformation est :

select concat(
if( substr( codeperm, 9, 2 ) < 50, 2000 + substr( codeperm, 9, 2 ) , 1900 + substr( codeperm, 9, 2 ) ),
'-',
if( substr( codeperm, 7, 2 ) > 50, substr( codeperm, 7, 2 ) -50, substr( codeperm, 7, 2 ) ),
'-',
if( substr( codeperm, 5, 2 ) < 31, substr( codeperm, 5, 2 ) -62, substr( codeperm, 5, 2 ) )
)
as DDN
FROM LaTable


LaTable est la table contenant le champ codeperm. Notez que cette commande est valide jusqu'en 2050 et pour les élèves nés après 1950. Cela est indiqué par la valeur 50 dans l'expression : substr( codeperm, 9, 2) < 50