Den här lösningen använder inga loopar, procedurer eller temporära tabeller . Underfrågan genererar datum för de senaste 10 000 dagarna och kan förlängas till att gå så långt bakåt eller framåt som du vill.
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'
Utdata:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Anmärkningar om prestanda
Testar det här , prestandan är förvånansvärt bra:frågan ovan tar 0,0009 sek.
Om vi utökar underfrågan till att generera ca. 100 000 nummer (och därmed cirka 274 års datum), den körs på 0,0458 sek.
Detta är för övrigt en mycket portabel teknik som fungerar med de flesta databaser med mindre justeringar.
SQL Fiddle-exempel som returnerar 1 000 dagar