сгенерировать эквивалент в MySQL - PullRequest
17 голосов
/ 29 июля 2011

Мне нужно выполнить запрос и присоединиться ко всем дням года, но в моей базе данных нет таблицы календаря.
После поиска в Google я нашел generate_series() в PostgreSQL.Есть ли в MySQL что-нибудь подобное?

Моя фактическая таблица имеет что-то вроде:

date     qty
1-1-11    3
1-1-11    4
4-1-11    2
6-1-11    5

Но мой запрос должен вернуть:

1-1-11    7
2-1-11    0
3-1-11    0
4-1-11    2
and so on ..

Ответы [ 3 ]

26 голосов
/ 29 июля 2011

Вот как я это делаю. Он создает диапазон дат от 2011-01-01 до 2011-12-31 :

select 
    date_format(
        adddate('2011-1-1', @num:=@num+1), 
        '%Y-%m-%d'
    ) date
from 
    any_table,    
    (select @num:=-1) num
limit 
    365

-- use limit 366 for leap years if you're putting this in production

Единственное требование состоит в том, чтобы число строк в any_table было больше или равно размеру необходимого диапазона (> = 365 строк в этом примере). Скорее всего, вы будете использовать это как подзапрос всего вашего запроса, поэтому в вашем случае any_table может быть одной из таблиц, которые вы используете в этом запросе.

4 голосов
/ 13 июля 2017

Я искал это решение, но без «жестко закодированной» даты, и я придумал эту, действительную на текущий год (помогло из этого ответов ).Обратите внимание, что

where year(date)=2011

не требуется, поскольку выбранные уже фильтруют дату.Также, таким образом, не имеет значения, какая таблица (по крайней мере, как указано до того, как таблица имеет по крайней мере 366 строк) использовалась, так как дата «вычисляется» во время выполнения.

 select date from (
    select
        date_format(
        adddate(MAKEDATE(year(now()),1), @num:=@num+1),
        '%Y-%m-%d'
    ) date
    from
        your_table,
    (select @num:=-1) num
    limit
        366 ) as dt
4 голосов
/ 03 ноября 2016

Усовершенствованная версия решения от @Karolis, обеспечивающая его работу в течение любого года (включая високосные):

select date from (
    select
        date_format(
        adddate('2011-1-1', @num:=@num+1),
        '%Y-%m-%d'
    ) date
    from
        any_table,
    (select @num:=-1) num
    limit
        366
) as dt
where year(date)=2011
...