impala:根据日期和时间将单行拆分为多行

b1uwtaje  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(1103)

我想根据时间把一行分成多行。

SrNo    Employee       StartDate                  EndDate
---------------------------------------------------------------------------
1         emp1      30/03/2020 09:00:00        31/03/2020 07:15:00  
2         emp2      01/04/2020 09:00:00        02/04/2020 08:00:00

预期产出如下:

SrNo    Employee       StartDate                  EndDate
---------------------------------------------------------------------------
1         emp1      30/03/2020 09:00:00        30/03/2020 11:59:00   
1         emp1      31/03/2020 00:00:00        31/03/2020 07:15:00  
2         emp2      01/04/2020 09:00:00        01/04/2020 11:59:00  
2         emp2      02/04/2020 00:00:00        02/04/2020 08:00:00

一天从上午00:00开始到第二天上午00:00。什么时候 EndDate 时间大于上午00:00(午夜),则将此日期分为两行。第一行结束日期为30/03/2020 11:59:00,下一行开始日期为31/03/2020 00:00:00。
请帮我解决这个问题。

3qpi33ja

3qpi33ja1#

这对于递归cte来说是个好地方,但不幸的是,hive不支持这些。下面是另一种方法,它使用派生的数字表来拆分时段:

select
    t.SrNo,
    t.Employee,
    greatest(t.startDate, date_add(to_date(t.startDate), x.n)) startDate,
    least(t.endDate, date_add(to_date(t.startDate), x.n + 1)) endDate
from mytable t
inner join (select 0 n union all select 1 union all select 2) x
    on date_add(to_date(t.startDate), x.n) <= t.endDate

您可以展开子查询以处理每行更多可能的句点。
还要注意,这会生成半开放的间隔,其中前一个间隔的结束时间等于下一个间隔的开始时间(而在结果集中有一分钟的延迟)。逻辑上,间隔在较小的边界上是包含的,在外部边界上是独占的(这样,您就可以确保不留下任何间隙)。

相关问题