Если вы хотите получить список дней с помощью SQL, например
выберите ... как дни, где date
находится между «2010-01-20» и «2010-01-24»
И вернуть данные, например:
days
----------
2010-01-20
2010-01-21
2010-01-22
2010-01-23
2010-01-24
В этом решении не используются циклы, процедуры или временные таблицы. Подзапрос генерирует даты за последнюю тысячу дней и может быть расширен так, чтобы вернуться назад или вперед по вашему желанию.
select a.Date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.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
) 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 с.
Между прочим, это очень переносимый метод, который работает с большинством баз данных с небольшими изменениями.
person
Pentium10
schedule
19.02.2010
generate_series
. - person Quassnoi   schedule 19.02.2010