You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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;

代码说明

  1. year_list:利用sequence函数生成1980到当前年份的整数序列,通过explode拆分为每行一个年份。
  2. nov_candidate_dates:对每个年份构造11月22日的基础日期,通过posexplode生成0-6的天数偏移量,得到22日到28日的所有候选日期。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:34:51