Deze oplossing gebruikt geen lussen, procedures of tijdelijke tabellen . De subquery genereert datums van de afgelopen 10.000 dagen en kan worden uitgebreid om zo ver terug of vooruit te gaan als u wilt.
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'
Uitvoer:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Opmerkingen over prestaties
Test het hier , de prestatie is verrassend goed:de bovenstaande zoekopdracht duurt 0,0009 sec.
Als we de subquery uitbreiden om ca. 100.000 nummers (en dus ongeveer 274 jaar aan datums), het loopt in 0,0458 sec.
Dit is overigens een zeer draagbare techniek die met kleine aanpassingen met de meeste databases werkt.
SQL Fiddle-voorbeeld wordt 1000 dagen geretourneerd