Mysql выбрать даты без таблиц

Мне просто нужно вернуть список всех дней в течение месяца. Я не получаю доступ к определенной таблице. Поэтому мне нужен оператор select sql, если он указан в феврале, возвратите следующее:

Day
----
2011-02-01
2011-02-02
2011-02-03
... etc, etc. 
2011-02-27
2011-02-28

Это должно быть довольно просто, я бы подумал, если бы я знал предложение select sql, которое мне нужно сделать. Месяц должен быть выбран, я передам это из окна выбора веб-страницы, которое позволяет пользователю выбирать месяц и год. Это будет основой для отчета. У меня уже есть оператор select, который будет занимать каждый из дней и указывать на записи, связанные с этими датами, но мне нужна эта таблица в качестве основы для моих отчетов.

Ответ 1

Я согласен с комментариями, что что-то подобное не следует делать в базе данных, но технически это возможно. Если вы даете начальную и конечную дату, добавьте дополнительные номера в подзапрос, если необходимо:

SELECT '2011-02-01' + INTERVAL a + b DAY dte
FROM
 (SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
    UNION SELECT 8 UNION SELECT 9 ) d,
 (SELECT 0 b UNION SELECT 10 UNION SELECT 20 
    UNION SELECT 30 UNION SELECT 40) m
WHERE '2011-02-01' + INTERVAL a + b DAY  <  '2011-03-01'
ORDER BY a + b

Результаты:

"2011-02-01"
"2011-02-02"
"2011-02-03"
....
"2011-02-28"

Ответ 2

- Это может быть излишним, но вы можете сделать такую ​​процедуру:

use dbname;

DELIMITER $$

DROP PROCEDURE IF EXISTS `days_of_month` $$

CREATE PROCEDURE `days_of_month`(iDate DATETIME) DETERMINISTIC

BEGIN

    DECLARE last_day,mm,yy,dd INT DEFAULT 0;
    SET dd = 1;
    SET mm = month(iDate);
    SET yy = year(iDate);

    set iDate = case when iDate is null then now() else iDate end;
    SET last_day = date_format(LAST_DAY(iDate),'%d');

    DROP TABLE IF EXISTS `days_of_month_tblTemp`;
    CREATE TEMPORARY TABLE days_of_month_tblTemp(tmpDate DATE);

    label1: LOOP
         insert into days_of_month_tblTemp(tmpDate) values (concat(yy,'-',mm,'-',dd));
        SET dd = dd + 1;
        IF dd < (last_day+1) THEN ITERATE label1; END IF;
         LEAVE label1;
      END LOOP label1;
      SELECT * from days_of_month_tblTemp;  
END $$

DELIMITER ;

- запустите его следующим образом: CALL days_of_month ('2012-02-22');

Ответ 3

Я немного прибавил, чтобы дать все предыдущие даты за последний месяц:

SELECT (SELECT Date (СЕЙЧАС() - ИНТЕРВАЛ 1 МЕСЯЦ)) + INTERVAL a + b DAY dte ИЗ  (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3   UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7   UNION SELECT 8 UNION SELECT 9) d,  (SELECT 0 b UNION SELECT 10 UNION SELECT 20   UNION SELECT 30 UNION SELECT 40) m WHERE (SELECT Date (NOW() - INTERVAL 1 MONTH)) + INTERVAL a + b DAY < (выберите дату (сейчас())) ORDER BY a + b;