一、问题描述
已知开始日期和结束日期,动态生成此范围内的日期序列。具体如下:
二、解决方案
1.原始表 test
create table test as
select 'A' as id, '2019-01-07' as begin_date, '2019-01-10' as end_date
union all
select 'A' as id, '2019-01-01' as begin_date, '2019-01-04' as end_date
union all
select 'B' as id, '2019-01-03' as begin_date, '2019-01-05' as end_date
2.数据处理
(1)计算需要重复的行数n(天数n=结束日期end_date - 开始日期begin_date);
(2)设计一个长度为 n 的数组对象。通过 space(n)函数 生成 n 个空格的字符串,split()函数 以空格为分隔符,将字符串变成含 n 个元素的数组,根据此,这里也可以换成 split(repeat(n, 分隔符),分隔符);
(3)通过udtf函数 posexplode()函数 对数组字段进列转行,同时生成行号 i ;
(4)最后,根据每行的行号 i,以及开始日期begin_date计算当前日期current_date。
select id, date_add (begin_date, pe.i) as current_date, begin_date, end_date
from test
lateral view
posexplode(split(space(datediff(end_date, begin_date)),' ')) pe as i, x
-- space()函数可以换成repeat
[参考]
1.如何在HIVE中生成日期序列?https://xbuba.com/questions/45278300