如何使用Spark SQL获取每年3月最后一个周日的凌晨1点时间
Spark SQL 获取每年3月最后一个周日凌晨1点的实现
直接通过日期函数组合即可实现需求,核心逻辑是先定位3月的最后一天(31日),再根据该日期的星期值回推得到最后一个周日,最后拼接凌晨1点的时间戳。
通用SQL示例
-- 生成年份范围(可替换为你的业务年份列表) WITH target_years AS ( SELECT explode(sequence(2020, 2030)) AS year ) SELECT year, -- 构造最终的夏令时开始时间(3月最后一个周日凌晨1点) timestamp( concat( -- 计算3月最后一个周日的日期 date_sub( to_date(concat(year, '-03-31')), -- 根据3月31日的星期值回推:1=周日,减0天;2=周一,减1天...7=周六,减6天 dayofweek(to_date(concat(year, '-03-31'))) - 1 ), ' 01:00:00' ) ) AS dst_start_time FROM target_years;
关键函数说明
to_date(concat(year, '-03-31')):快速构造当年3月的最后一天(31日)dayofweek(date):Spark SQL中返回1(周日)到7(周六)的星期数值,用于计算需要回推的天数date_sub(date, num_days):将3月31日回推对应天数,得到3月最后一个周日的日期timestamp(concat(date, ' 01:00:00')):拼接凌晨1点的时间字符串并转换为时间戳类型,得到最终的夏令时触发时间
验证示例
以2023年为例:
- 2023年3月31日是周五(
dayofweek返回6),回推5天得到3月26日(周日),最终结果为2023-03-26 01:00:00 - 2024年3月31日是周日(
dayofweek返回1),回推0天,最终结果为2024-03-31 01:00:00
内容的提问来源于stack exchange,提问作者HelpSeeker
相关产品推荐
相关产品推荐

