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
您可以扩展子查询以处理每行更多可能的时间段。
另请注意,这会生成半开间隔,其中前一个间隔的结束等于下一个间隔的开始(而在您的结果集中有一分钟的延迟)。逻辑是间隔在其较小的边界上是包含的,而在外部边界上是独占的(这样,你确保不留下任何间隙)。
我想根据时间将单行拆分为多行。
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
您可以扩展子查询以处理每行更多可能的时间段。
另请注意,这会生成半开间隔,其中前一个间隔的结束等于下一个间隔的开始(而在您的结果集中有一分钟的延迟)。逻辑是间隔在其较小的边界上是包含的,而在外部边界上是独占的(这样,你确保不留下任何间隙)。