c0nstruct0r
@c0nstruct0r
PHP программист

Как получить все даты с 01-01-2014 по сегодня с помощью простого mysql-запроса без хранимы процедур?

Как получить все даты с 01-01-2014 по сегодня с помощью простого mysql-запроса без хранимы процедур?

Есть решение типа такого, но оно мне кажется некрасивым плюс. Можно ли проще?

SELECT '2014-01-01' + INTERVAL (36 * a.num + b.num) DAY `date`
 FROM
(
	SELECT 0 AS num 
	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
	UNION ALL SELECT 10
	UNION ALL SELECT 11
	UNION ALL SELECT 12
	) AS a,
(
	SELECT 0 AS num 
	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
	UNION ALL SELECT 10
	UNION ALL SELECT 11
	UNION ALL SELECT 11

	) AS b
WHERE '2014-02-01' + INTERVAL (6 * a.num + b.num) DAY <= '2016-11-21'
ORDER BY 1
  • Вопрос задан
  • 499 просмотров
Пригласить эксперта
Ответы на вопрос 4
@feldwebel
То ли дело в postgreSQL:
SELECT * FROM generate_series('2014-01-01'::timestamp, now(), '1 day');
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Нельзя.
Mysql не умеет никакого подобия generate_series. И даже хранимка может лишь вывести список дат. Приджойнить этот список к чему-нибудь другому нельзя.

К слову, order by 1 - deprecated. "Use of column positions is deprecated because the syntax has been removed from the SQL standard."
Ответ написан
Комментировать
c0nstruct0r
@c0nstruct0r Автор вопроса
PHP программист
Нашел еще вот такое
select a.Date d
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 union all select 10) 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 union all select 10) 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 union all select 10) as c
) a
where a.Date between '2014-01-01' and '2016-11-24' 
group by d
Ответ написан
Комментировать
@psycho-coder
Eternal student
А почему именно с помощью SQL, а не php или python?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы