ODPS 不用循环生成连续日期

生成 20230801 ~ 20230831之间的每一天的sql代码怎么写? 只要一行代码.

一行代码:

select TO_CHAR(DATEADD(TO_DATE(bizdate,'yyyymmdd'),d,'dd'),'yyyymmdd') 
from (select * from values ('20230801',sequence(0,20,1)) t(bizdate,ds))
LATERAL VIEW explode(ds) D as d;

 

分析:

  1. values 创建临时表, 语法:
     select * from values (xxx),(xxx) t(col1,col2...) 
    这里的  select * from values ('20230801',sequence(0,20,1)) t(bizdate,ds)  建立了一个临时表, bizdate是起始值, ds是一个序列 [1,2,3,4,...20]

 

  1. explode 可以把列表展开, 每个元素变成一行开, 如下图这样

 

  1. lateral view 可以让bizdate与展开列表D中的每一项进行组合.

     LATERAL VIEW explode(ds) D as d  的意思就是 列表ds展开成临时表D, 其中的每一个元素的列名是d

 

  1. dateadd    TO_CHAR(DATEADD(TO_DATE(bizdate,'yyyymmdd'),d,'dd'),'yyyymmdd')  把bizdate与d相加即可生成连续的日期

 

posted @ 2023-08-30 20:35  酱_油  阅读(174)  评论(0编辑  收藏  举报