Solusi ini menggunakan tanpa loop, prosedur, atau tabel sementara . Subquery menghasilkan tanggal untuk 10.000 hari terakhir, dan dapat diperpanjang untuk maju atau mundur sejauh yang Anda inginkan.
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'
Keluaran:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
Catatan tentang Kinerja
Mengujinya di sini , kinerjanya sangat bagus:kueri di atas membutuhkan waktu 0,0009 detik.
Jika kita memperluas subquery untuk menghasilkan kira-kira. 100.000 angka (dan dengan demikian tanggal sekitar 274 tahun), itu berjalan dalam 0,0458 detik.
Kebetulan, ini adalah teknik yang sangat portabel yang bekerja dengan sebagian besar database dengan sedikit penyesuaian.
Contoh SQL Fiddle mengembalikan 1.000 hari