generate_series()在MySQL中的等价



我需要做一个查询,并与一年中的所有日子,但在我的数据库中没有日历表。
在谷歌搜索后,我在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 ..

我是这样做的。它创建了一个日期范围,从2011-01-012011-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可以是该查询中使用的表之一。

以防有人在MySQL中寻找generate_series()来生成一系列日期或整数作为临时表。

使用MySQL8 (MySQL版本8.0.27),你可以做这样的事情来模拟:

WITH RECURSIVE nrows(date) AS (
SELECT MAKEDATE(2021,333) UNION ALL 
SELECT DATE_ADD(date,INTERVAL 1 day) FROM nrows WHERE  date<=CURRENT_DATE
)
SELECT date FROM nrows;
结果:

2021-11-29
2021-11-30
2021-12-01
2021-12-02
2021-12-03
2021-12-04
2021-12-05
2021-12-06

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

我一直在寻找这个解决方案,但没有"硬编码"日期,我想出了这个对今年有效的解决方案(从这些答案中得到帮助)。请注意

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

相关内容

  • 没有找到相关文章

最新更新