如何使用Hive获取1980年起任意年份11月第四个周五的日期
Hive实现1980年后每年11月第四个周五(黑五)日期获取
核心思路
每年11月的第四个周五必然落在11月22日-28日区间内(第一个周五最早为11月1日,加3周即21天为22日;第一个周五最晚为11月7日,加21天为28日)。只需遍历该区间的日期,筛选出周五即可。
实现代码
WITH year_list AS ( -- 生成1980年到当前年份的所有年份 SELECT explode(sequence(1980, year(current_date()))) AS year ), nov_candidate_dates AS ( -- 对每个年份,生成11月22日至28日的候选日期 SELECT year, date_add(to_date(concat(year, '-11-22')), pos) AS candidate_date FROM year_list -- 生成0-6的偏移量,对应22日加0到6天 LATERAL VIEW posexplode(sequence(0, 6)) t AS pos, offset ), black_friday_dates AS ( -- 筛选候选日期中的周五 SELECT year, candidate_date AS black_friday_date FROM nov_candidate_dates -- 使用date_format的'u'模式:1=周一,5=周五,7=周日 WHERE date_format(candidate_date, 'u') = 5 ) -- 按年份排序输出 SELECT * FROM black_friday_dates ORDER BY year;
代码说明
- year_list:利用
sequence函数生成1980到当前年份的整数序列,通过explode拆分为每行一个年份。 - nov_candidate_dates:对每个年份构造11月22日的基础日期,通过
posexplode生成0-6的天数偏移量,得到22日到28日的所有候选日期。 - black_friday_dates:通过
date_format(candidate_date, 'u') = 5筛选出周五日期(u模式下周五对应数字5)。
兼容性说明
- 代码依赖Hive 2.0及以上版本(支持
sequence函数)。 - 若使用低版本Hive(<2.0),可替换
year_list为递归CTE生成年份(需Hive 1.3+支持):
WITH year_list AS ( SELECT 1980 AS year UNION ALL SELECT year + 1 FROM year_list WHERE year < year(current_date()) )
内容的提问来源于stack exchange,提问作者user22874206
相关产品推荐
相关产品推荐

