在 Hive 中获取最后一个工作日的第 15 个日期-yyyyMMdd(仅周末除外)
Posted
技术标签:
【中文标题】在 Hive 中获取最后一个工作日的第 15 个日期-yyyyMMdd(仅周末除外)【英文标题】:Fetching the 15th last working day date-yyyyMMdd (excluding only weekends) in Hive 【发布时间】:2020-02-21 08:53:15 【问题描述】:我有一个带有 date 列的表格(日期为字符串格式 yyyyMMdd)。我的要求是设计一个逻辑,在不使用 UDF 或 shell 脚本的情况下,从“日期列值等于前 15 个工作日的日期”(仅不包括周六和周日)的表中获取数据。例如今天是 2020 年 2 月 21 日;逻辑应该产生一个输出:20200203。
【问题讨论】:
三个问题: 1、如果前一个工作日是2月20日,那么前15个工作日怎么算为2月3日? 2、当输入的日期是周末时,你想要什么行为? 3、请说明是否需要排除节假日(这样会更简单,因为我们需要一个日历表)? @markwusinich 1. 我可能没有正确解释它......对不起,我需要将当前日期计算为第一个工作日并回到第 15 个工作日。 2. 我想跳过周六或周日的日期。 3. 我的要求是只忽略周六和周日,不需要考虑节假日。目前我已经实现了 where date =(date_format(date_sub(CURRENT_DATE,15),'yyyyMMdd') 但这基于包括周末在内的所有日历日期。 【参考方案1】:假设您实际上是指基于您的示例的前 14 个工作日,并且您忽略了假期,它只是一个 date_sub 函数,其中包含一周中的某一天的 case 语句。
case from_unixtime(unix_timestamp(event_date,'yyyyMMdd'),'u')
when 1 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
when 2 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
when 3 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
when 4 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
when 5 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),18),'-','')
when 6 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),18),'-','')
when 7 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),19),'-','')
end as new_date
这假设周六/周日应该像周一一样对待, 如果周六/周日应该像周五,那么请使用 19、20。
如果您需要考虑假期,那么您需要创建一个包含每一天的日历表,并注意哪些日子是假期,然后它是对表的连接和一些可以弄清楚的逻辑,如果就是这样。
【讨论】:
我的要求是只忽略周六和周日,不需要考虑节假日。目前我已经实现了 where date =(date_format(date_sub(CURRENT_DATE,15),'yyyyMMdd') 但这基于包括周末在内的所有日历日期。以上是关于在 Hive 中获取最后一个工作日的第 15 个日期-yyyyMMdd(仅周末除外)的主要内容,如果未能解决你的问题,请参考以下文章
使用给定的 DateTime 对象获取一个月的第一天和最后一天