
Générer, à la volée, une table de dates avec Mysql
Dans les traitements liés aux stats ou dans des SP pour des applications, il peut etre nécessaire (ou utile) de générer à la volée une table de date plutôt qu’en stocker une en dur.
Ceci n’est pas très complexe mais permet d’utiliser diverses fonctions liées aux dates de Mysql (Date_add, Date_Format, weekday, Month, Year …) mais, aussi, la souvent très utile fonction ELT qui retourne, pour un index donné, la valeur correspondante.
La génération de la série de date est faite par une bête combinaison Full Join de tables de base 10, listant des chiffres de 0 à 9, concaténées puis convertit en int. On a alors une table de 0 à 9999 valeurs que nous utilisons pour ajouter des jours a la date de début. Ceci implique que cette méthode ne permet de générer qu’une période d’un peu plus de 27 ans au maximum … Pour faire plus, ajoutez une table « e » au full join et dans le concat !
SET @Date_de := '2024-04-01';
SET @Date_a := NOW();
SELECT d_id
,d_date
,CONCAT_WS(' ',ELT(DAYOFWEEK(d_date), 'Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi') , IF(DAY(d_date)=1,'1er',DAY(d_date)),ELT(MONTH(d_date), 'Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'), YEAR(d_date)) d_lib
,ELT(DAYOFWEEK(d_date), 'Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi') d_joursemaine
,ELT(MONTH(d_date), 'Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre') d_mois
,CONCAT_WS(' ','Du', DATE_FORMAT(DATE_ADD(d_date, INTERVAL -DAYOFWEEK(DATE_ADD(d_date, INTERVAL -1 DAY))+1 DAY),'%d/%m/%Y') , 'au', DATE_FORMAT(DATE_ADD(d_date, INTERVAL -DAYOFWEEK(DATE_ADD(d_date, INTERVAL -1 DAY))+7 DAY),'%d/%m/%Y')) d_semaine
FROM ( SELECT CONVERT(CONCAT(a,b,c,d), UNSIGNED)+1 d_id, DATE_ADD(@Date_de, INTERVAL CONVERT(CONCAT(a,b,c,d), UNSIGNED) DAY) d_date
FROM (SELECT 1 a UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) a
,(SELECT 1 b UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) b
,(SELECT 1 c UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) c
,(SELECT 1 d UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) d ) D
WHERE d_date BETWEEN @Date_de AND @Date_a
ORDER BY d_date;

