【问题标题】:How to calculate number of business days (Monday to friday) between two dates in hive? [closed]如何计算蜂巢中两个日期之间的工作日数(周一至周五)? [关闭]
【发布时间】:2021-09-05 08:53:36
【问题描述】:

hive 中两个日期之间的工作日数

【问题讨论】:

    标签: sql date datetime hive hiveql


    【解决方案1】:

    简单的问题但复杂的答案:) 请注意,我选择了周六和周日作为非工作日。
    首先,您需要生成一个时间序列。然后计算系列中的工作日数。 第 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
    

    我在 SQL 上运行以获取示例数据。 编辑:我用 OR 子句更新了 SQL。

    【讨论】:

    • 嘿嗨,我确实尝试过这段代码,但是当日期没有差异时,我没有得到 0,而不是得到工作日。
    • 这种情况可以使用OR轻松处理。您能否在回答中参考更新的 SQL?
    【解决方案2】:

    选择 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

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2022-12-06
      • 1970-01-01
      相关资源
      最近更新 更多