Questa soluzione non utilizza nessun ciclo, procedure o tabelle temporanee . La sottoquery genera le date degli ultimi 10.000 giorni e può essere estesa per andare indietro o avanti a piacimento.
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'
Risultato:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Note sul rendimento
Provalo qui , le prestazioni sono sorprendentemente buone:la query precedente richiede 0,0009 sec.
Se estendiamo la sottoquery per generare ca. 100.000 numeri (e quindi circa 274 anni di date), viene eseguito in 0,0458 sec.
Per inciso, questa è una tecnica molto portabile che funziona con la maggior parte dei database con piccoli aggiustamenti.
Esempio SQL Fiddle che restituisce 1.000 giorni