一、背景
使用sql将日期范围转成具体的日期,如 (2021-06-01, 2021-07-01) 转成2021-06-01, 2021-06-02, 2021-06-03,…, 2021-07-01.
二、方案
select
tmp.start_date,
val,
pos,
date_add(start_date, pos)
from(
select
'2021-07-01' as start_date,
'2021-07-31' as end_date
)tmp
lateral view posexplode( split( space( datediff( end_date, start_date ) ), '' ) ) t as pos, val
;

三、解析
- select datediff( ‘2021-07-31’, ‘2021-07-01’ );可以获得两个日期的间隔,得到一个整数
 - space( n)可以获得一个由n个空格组成的字符串,如
 - split(space(n), " "),可以获得一个长度为30的数组
select split( space( datediff( ‘2021-07-31’, ‘2021-07-01’ ) ), ‘’) ;  - posexplode( array ); 可以获得 array 的每个元素及其坐标,不同于explode,explode只能活的 array 的元素
select posexplode( split( space( datediff( ‘2021-07-31’, ‘2021-07-01’ ) ), ‘’) ); 
四、扩展
可以用这种方式在sql里实现for循环的效果。
|