【发布时间】:2021-09-05 08:53:36
【问题描述】:
hive 中两个日期之间的工作日数
【问题讨论】:
标签: sql date datetime hive hiveql
hive 中两个日期之间的工作日数
【问题讨论】:
标签: sql date datetime hive hiveql
简单的问题但复杂的答案:) 请注意,我选择了周六和周日作为非工作日。
首先,您需要生成一个时间序列。然后计算系列中的工作日数。
第 1 步 - 创建时间序列可以使用lateral view posexplode.
lateral view posexplode(split(space(datediff(t.end_dt,t.start_dt)),' ')) pe as i,x
第 2 步 - 使用 extract(days of week timestamp_col) 函数计算一天既不是星期六也不是太阳的计数。
星期日 - 1 星期六 - 7
case when extract(dayofweek from day) in (1,7) then 0 else 1 end
所以,完整的代码如下所示 -
select end_date, start_date,
sum(case when extract(dayofweek from day) in (1,7) or or to_date(start_date )=to_date(end_date) then 0 else 1 end) no_of_week_day
from (
select end_date, start_date , date_add (t.start_date,pe.i) as Day
from etl.x t
lateral view posexplode(split(space(datediff(t.end_date,t.start_date)),' ')) pe as i,x ) rs
group by end_date, start_date
【讨论】:
OR轻松处理。您能否在回答中参考更新的 SQL?
选择 flw_up_actv_dt,flw_up_dt, 总和(在 (1,7) 中提取 (dayofweek from day) 然后 0 else 1 end) no_of_week_day 从 ( 选择 flw_up_actv_dt , flw_up_dt , date_add(t.flw_up_dt,pe.i) 作为日期 来自 consumer_usrs.commitments_mgexp t 侧视图posexplode(split(空间(datediff(t.flw_up_actv_dt, t.flw_up_dt)),'')) pe as i,x) rs 分组由 flw_up_actv_dt ,flw_up_dt;
输出: 2020-01-02 2020-01-02 146 2020-01-03 2020-01-02 398 2020-01-03 2020-01-03 176 2020-01-04 2020-01-02 4 2020-01-04 2020-01-03 9 2020-01-04 2020-01-04 0
【讨论】: