在我的例子中,我们有一个假设为 1 行的表 ABC。
id | 名称 | 开始日期 | end_date |
---|---|---|---|
1 | 拉胡尔 | 01/01/2021 | 06/01/2021 |
但在检索时,我想获得多行,其中开始日期以 1 递增,直到它小于或等于结束日期。
id | 名称 | 开始日期 | end_date |
---|---|---|---|
1 | 拉胡尔 | 01/01/2021 | 06/01/2021 |
1 | 拉胡尔 | 02/01/2021 | 06/01/2021 |
1 | 拉胡尔 | 03/01/2021 | 06/01/2021 |
1 | 拉胡尔 | 04/01/2021 | 06/01/2021 |
1 | 拉胡尔 | 05/01/2021 | 06/01/2021 |
1 | 拉胡尔 | 06/01/2021 | 06/01/2021 |
请告诉我我们如何做到这一点。
答案 0 :(得分:0)
使用generate_series()
。假设数据是按天计算的:
select t.id, t.name, gs.date, t.end_date
from t cross join lateral
generate_series(start_date, end_date, interval '1 day') gs(date);
如果您的数据实际上是按月计算的,您只需将 '1 day'
更改为 '1 month'
。
注意:Postgres 允许在 select
中设置返回函数,因此您可以将其写为:
select t.id, t.name,
generate_series(start_date, end_date, interval '1 day') as date,
t.end_date
from t;
但是,我认为这不是一个好习惯。我对 select
表达式更改查询返回的行数感到不舒服。