从 SQL 到 SPL:计算年月区间包含的所有年月

某库表的第 2 和第 3 个字段分别是起始年月和终止年月,格式是”年 M 月”。

Project

ScenarioStart

ScenarioEnd

1

2024M9

2025M3

2

2024M6

2024M10

现在要增加计算列 TimePeriods:用起始年月和终止年月算出间隔为一个月的连续日期序列,用竖线拼接起来,日期格式保持”年 M 月”不变。

Project

ScenarioStart

ScenarioEnd

TimePeriods

1

2024M9

2025M3

2024M09|2024M10|2024M11|2024M12|2025M01|2025M02|2025M03

2

2024M6

2024M10

2024M06|2024M07|2024M08|2024M09|2024M10

SQL 没有直接生成日期序列的函数,通常要用 JOIN 或者递归间接生成多条记录,结构上非常复杂。有些数据库没有分组后拼接字符串的聚合函数,即使生成了多条记录的日期序列,再生成指定格式的字符串也仍然非常困难。

SPL 可以直接生成日期序列,也有强大的处理字段串集合的方法,再拼接成指定格式非常容易:


 A

1

=dbConn.query("select *, null as TimePeriods from tb”)

2

=A1.run(#4=periods@m(date(#2,"yyyy'M'MM"),date(#3,"yyyy'M'MM"),1).(string(~,"yyyy'M'MM")).concat("|"))

A1:从数据库加载数据,新增空字段TimePeriods

A2:按指定格式识别起始和终止年月,生成间隔为 1 个月的日期序列,将序列的每个成员转为指定格式的字符串,用竖线拼起来。periods 可生成日期序列,@m 表示间隔单位为月。concat 用于拼接字符串集合。

问题来源:https://stackoverflow.com/questions/78330406/how-do-i-update-a-sql-table-using-a-generated-variable-on-each-row