SQL Athena中date_part函数未注册:如何获取最近的周日?
在Athena中获取最近的周日(或任意指定星期几)
嘿,这个问题我熟!Athena用的是Presto/Trino引擎,和Redshift的函数体系不一样,所以date_part在这里用不了,但咱们有更合适的方法来实现需求:
获取最近的周日
这里有两种简单的写法,你可以选顺手的:
方法1:用extract()结合条件判断
Athena里extract(dow FROM 日期)会返回0(周日)到6(周六)的数字,我们可以根据这个来计算:
SELECT CASE WHEN extract(dow FROM current_date) = 0 THEN current_date ELSE date_add('day', -extract(dow FROM current_date), current_date) END AS most_recent_sunday;
逻辑很直观:如果当天就是周日,直接返回;否则减去当前日期对应的dow数值,就能回到最近的周日。
方法2:用date_trunc快速截断
Athena的date_trunc支持指定一周的起始日,把周日设为周起始后,直接截断到周就能得到最近的周日:
SELECT date_trunc('week', current_date, 7)::date AS most_recent_sunday;
这里的7就是指定周日作为一周的第一天,截断后转成date类型就得到了目标日期,是不是更简洁?
获取任意指定的星期几
如果要获取最近的某一天(比如周三、周五),可以基于上面的逻辑调整。我们先定义目标星期几的dow值(0=周日,1=周一,…6=周六),然后计算:
WITH target_day AS ( SELECT 3 AS target_dow -- 这里改成你要的星期几,比如3=周三 ) SELECT CASE WHEN extract(dow FROM current_date) >= target_dow THEN date_add('day', target_dow - extract(dow FROM current_date), current_date) ELSE date_add('day', target_dow - extract(dow FROM current_date) - 7, current_date) END AS most_recent_target_day FROM target_day;
举个例子:如果今天是周五(dow=5),要找最近的周三(dow=3),因为5>=3,所以用3-5=-2,也就是往前推2天,正好是周三;如果今天是周二(dow=2),要找周三的话,2<3,就用3-2-7=-6,往前推6天就是上周三,也就是最近的那一天。
内容的提问来源于stack exchange,提问作者ShiraP
相关产品推荐
相关产品推荐

