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

Impala: Split single row into multiple rows based on Date and time

我想根据时间将单行拆分为多行。

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 AM(午夜)时,将此日期分成两行。第一行结束日期为 30/03/2020 11:59:00,下一行开始于 31/03/2020 00:00:00。

请帮我解决。

这将是递归 CTE 的好地方,但不幸的是 Hive 不支持这些。这是另一种方法,它使用派生的 table 数字来分割句点:

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

您可以扩展子查询以处理每行更多可能的时间段。

另请注意,这会生成半开间隔,其中前一个间隔的结束等于下一个间隔的开始(而在您的结果集中有一分钟的延迟)。逻辑是间隔在其较小的边界上是包含的,而在外部边界上是独占的(这样,你确保不留下任何间隙)。