Générer, à la volée, une table de dates avec Mysql

Générer, à la volée, une table de dates avec Mysql

Vendredi, 18 Octobre 2024 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;


Pas de commentaire encore
Recherche