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;