Mysql
 sql >> Base de données >  >> RDS >> Mysql

générer des jours à partir de la plage de dates

Cette solution n'utilise pas de boucles, de procédures ou de tables temporaires . La sous-requête génère des dates pour les 10 000 derniers jours et peut être étendue pour aller aussi loin en arrière ou en avant que vous le souhaitez.

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) a
where a.Date between '2010-01-20' and '2010-01-24' 

Sortie :

Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20

Remarques sur les performances

Testez-le ici , les performances sont étonnamment bonnes :la requête ci-dessus prend 0,0009 seconde.

Si nous étendons la sous-requête pour générer env. 100 000 numéros (et donc environ 274 années de dates), il s'exécute en 0,0458 seconde.

Incidemment, il s'agit d'une technique très portable qui fonctionne avec la plupart des bases de données avec des ajustements mineurs.

Exemple SQL Fiddle renvoyant 1 000 jours