Я не хотел, чтобы в моем SQL-запросе требовались внешние зависимости (необходимо иметь таблицу календаря, процедуру заполнения временной таблицы датами и т. д.). Первоначальная идея этого запроса взята из http: // jeffgarretson . / word /. / / 2012/05/04 / generate-a-range-of-date-in-mysql / , который я немного оптимизировал для ясности и простоты использования.
SELECT (CURDATE() - INTERVAL c.number DAY) AS date
FROM (SELECT singles + tens + hundreds number FROM
( SELECT 0 singles
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
) singles JOIN
(SELECT 0 tens
UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30
UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60
UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90
) tens JOIN
(SELECT 0 hundreds
UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300
UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600
UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900
) hundreds
ORDER BY number DESC) c
WHERE c.number BETWEEN 0 and 364
Простая оптимизация и масштабирование этой таблицы для других целей. Вы можете легко избавиться от десятков и сотен таблиц, если вам нужна только одна неделя данных.
Если вам нужен больший набор чисел, легко добавить таблицу тысяч. Вам нужно всего лишь скопировать и вставить таблицу сотнями и добавить нуль в 9 чисел.