我需要查询并加入一年中的所有日子,但在我的数据库中没有日历表。
谷歌搜索后,我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 ..
我需要查询并加入一年中的所有日子,但在我的数据库中没有日历表。
谷歌搜索后,我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 ..
我就是这样做的。它创建从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可以是您在该查询中使用的表之一。
@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
以防万一有人正在寻找 generate_series() 来生成一系列日期或整数作为 MySQL 中的临时表。
使用 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