在select语句中显示时间范围的月份

b4lqfgs4  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(262)

我有以下数据结构:

ID,Name,Start,End
1,Aaron,01-01-2020,31-12-2020
2,Example,01-01-2020,31-6-2020

开始和结束表示日期。
我选择的结果应该如下所示,假设我从上面的数据开始:

ID,Name,Month
1,Aaron,January
1,Aaron,February
1,Aaron,March
1,Aaron,April...
1,Aaron,December

2,Example,January...
2,Example,June.

所以我真正想要的是在每个时间范围内得到所有的月份。只有一个选择可以吗?或者我可以尝试另一种方法吗?

ua4mk5z4

ua4mk5z41#

我建议使用递归的cte,但直接基于您的数据。像这样:

with recursive cte as (
      select id, name, start, end
      from t
      union all
      select id, name, start + interval 1 month, end
      from cte
      where start < end
     )
select id, name, monthname(start) as month
from cte;

不需要生成月份和日期的列表,然后连接回原始数据。

vhipe2zx

vhipe2zx2#

with recursive months(x,m,mn) as (
  select '2019-01-01' as x, month('2019-01-01')as m, monthname('2019-01-01') as mn
  union all
  select DATE_ADD(x,INTERVAL 1 MONTH), MONTH(DATE_ADD(x,INTERVAL 1 MONTH)), MONTHNAME(DATE_ADD(x,INTERVAL 1 MONTH))
  from months
  where x<'2023-12-31'
)
select d.ID, d.Name, m.mn 
from datastructure d
inner join months m on x between d.start and d.end;

在上面的语句中,当前的固定值 2019-01-01 以及 2023-12-31 应根据用户的需要进行更改。。。。
WITH 将创建一个临时表,可在下一个select语句中使用。

相关问题