このソリューションは、ループ、プロシージャ、または一時テーブルを使用しません 。サブクエリは過去10,000日間の日付を生成し、必要に応じて前後に拡張できます。
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'
出力:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
パフォーマンスに関する注意事項
こちら でテストしてください 、パフォーマンスは驚くほど良好です。上記のクエリには0.0009秒かかります。
サブクエリを拡張して約を生成するとします。 100,000の数字(したがって、約274年分の日付)、0.0458秒で実行されます。
ちなみに、これは非常に移植性の高い手法であり、ほとんどのデータベースでわずかな調整で機能します。