ODPS SQL 生成n个月的日期月份
代码参考:
WITH month_seq AS
(
SELECT TO_CHAR(DATEADD(GETDATE(),-diff,'mm'),'yyyy-MM') AS year_month
,diff
FROM (
SELECT EXPLODE(SEQUENCE(0,11)) AS diff
)
)
SELECT year_month
,diff
FROM month_seq
;
-
EXPLODE(SEQUENCE(0,11)):SEQUENCE函数生成一个从0到11的数字序列,即一个包含12个元素[0,1,2,...,11]的数组。EXPLODE函数将这个数组拆解成一列,每个元素成为数组中的一行,因此它将生成一个包含12行,值从0到11的临时表。 -
TO_CHAR(DATEADD(GETDATE(),-diff,'mm'),'yyyy-MM'):这里使用了DATEADD函数将GETDATE()(当前日期)减去上面提到的数组中的每个元素(通过diff引用)。TO_CHAR函数根据格式'yyyy-MM'将结果日期转换成字符串。 -
SELECT ... AS year_month, diff:选择上面转换的年月字符串和原始的差异值diff,并为这些列指定别名year_month和diff。 -
WITH month_seq AS (...):这是一个公用表表达式(CTE),它定义了一个名为month_seq的临时结果集。这里month_seq包含了两列:year_month和diff。 -
SELECT year_month, diff FROM month_seq:这是对month_seq公用表表达式的引用,选择了year_month和diff两列并返回结果。
最后,整个SELECT语句返回了一个结果集,其中包括了从现在起到过去11个月(总共12个月)每个月对应的年月表示和其相对于当前月的月份差。
视图
CREATE VIEW test_view
(
@end_date DATETIME, @num BIGINT
) AS
SELECT TO_CHAR(DATEADD(@end_date,-diff,'mm'),'yyyy-MM') AS year_month
,diff
FROM (
SELECT EXPLODE(SEQUENCE(0,@num - 1)) AS diff
)
;
SELECT *
FROM test_view(GETDATE(),12)
;

本文介绍了使用ODPS SQL生成n个月日期月份的方法。通过相关函数生成数字序列并拆解成临时表,将当前日期减去数组元素,再转换为字符串。利用公用表表达式定义临时结果集,最终返回从现在起到过去11个月每个月的年月表示及月份差。

1881

被折叠的 条评论
为什么被折叠?



