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)
;