在 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(仅周末除外)的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中获取数组中的第一个和最后一个元素?

在c#中获取上个月的第一天和最后一天的日期

使用给定的 DateTime 对象获取一个月的第一天和最后一天

如何在 hive sql 中获取每个组的最大 row_number()

获取本周的第一天和最后一天

如何获取给定 Google Cloud Storage 文件夹的第一个和最后一个文件?