1. ホーム
  2. sql

[解決済み] 日付範囲から日数を生成する

2022-05-09 23:33:56

質問

次のようなクエリを実行したい。

select ... as days where `date` is between '2010-01-20' and '2010-01-24'

といったデータを返す。

日間
----------
2010-01-20
2010-01-21
2010-01-22
2010-01-23
2010-01-24

どのように解決するのですか?

本ソリューションでは ループ、プロシージャ、テンポラリテーブルなし . このサブクエリは、過去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秒です。

サブクエリを拡張して約10万件(つまり約274年分の日付)の数字を生成すると、0.0458秒で実行されます。

ちなみに、これは非常にポータブルな手法で、少しの調整でほとんどのデータベースで動作します。

1,000日を返すSQL Fiddleの例