为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL中的generate_series()等价物

MySQL中的generate_series()等价物

慕田峪9158850 2019-08-28 10:50:11
MySQL中的generate_series()等价物我需要进行查询并加入一年中的所有日子,但在我的数据库中没有日历表。google-ing后我generate_series()在PostgreSQL中找到了。MySQL有类似的东西吗?我的实际表格如下:date     qty1-1-11    31-1-11    44-1-11    26-1-11    5但我的查询必须返回:1-1-11    72-1-11    03-1-11    04-1-11    2and so on ..
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

我就是这样做的。它创建了2011-01-012011-12-31的一系列日期:

select 
    date_format(
        adddate('2011-1-1', @num:=@num+1), 
        '%Y-%m-%d'
    ) datefrom 
    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可以是您在该查询中使用的表之一。


查看完整回答
反对 回复 2019-08-28
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

@Karolis增强版解决方案确保其适用于任何一年(包括闰年):

从(选择日期)
    选择
        日期格式(
        adddate('2011-1-1',@ num:= @ num + 1),
        '%Y-%间 - %d'
    )约会
    从
        any_table,
    (选择@num:=  -  1)num
    限制
        366)作为dt年(日期)= 2011年


查看完整回答
反对 回复 2019-08-28
?
慕容3067478

TA贡献1773条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 1718 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信