MySQL中的generate_series()等价物

时间:2011-07-29 08:26:50

标签: mysql sql postgresql generate-series

我需要查询并加入一年中的所有日子,但在我的数据库中没有日历表 在google之后我在PostgreSQL中找到了generate_series()。 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 个答案:

答案 0 :(得分:26)

我就是这样做的。它会创建一系列日期,从 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 可以是您在该查询中使用的表之一。

答案 1 :(得分:4)

来自@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

答案 2 :(得分:4)

我正在寻找这个解决方案,但没有“硬编码”的日期,我想出了一个有效的当年(从answers得到帮助)。 请注意

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