如何自定义周
创建于 2022-11-01 / 最近更新于 2022-11-08 / 3194
字体:
[默认]
[大]
[更大]
需求背景
有时候常规周(周一到周日)不能满足我们的业务场景,需要自定义周来实现。
例如:如何实现周四到周三为一周?
实现方法
普通数据集
首先了解一下获取星期几的函数dayofweek([日期])与获取第几周的函数weekofyear([日期])。
spark当中星期是从星期日到星期六为一个周,也就是1到7(如下图所示),想得到常规星期需要dayofweek([日期])-1。
实现周四到周三为一周,那么每周的四五六日都应该推迟到下个周当中。
case when dayofweek([日期]) in (1,5,6,7)
then WEEKOFYEAR([日期])+1
else WEEKOFYEAR([日期])
end
最终结果:可以看出按照标准星期(周一至周日也就是1至0),已经实现从周四到周三为一周。
高性能数据集
使用函数 toDayOfWeek([日期]),先获取到该日期是星期几。
toDayOfWeek, 将Date或DateTime转换为包含一周中的某一天的编号的UInt8(周一是1, 周日是7)类型的数字。
使用函数获取该日期是属于第几周。
toWeek(日期[,模式]) ,返回Date或DateTime的周数。两个参数形式可以指定星期是从星期日还是星期一开始,以及返回值应在0到53还是从1到53的范围内。如果省略了mode参数,则默认 模式为0。
做判断,如果要实现周四-周三为自定义周,那么每周的周四、五、六、周日,这四天都要推迟到下周
case when [返回星期几] in(4,5,6,7) then ([正常周]+1) else [正常周] end
效果如下:
【注意事项】:初始的日期字段必须是Date或是DateTime类型的,如果不是的话 需要做先做转换,
toDate/toDateTime函数的日期和日期时间格式定义:YYYY-MM-DD 或者 YYYY-MM-DD hh:mm:ss
8 人点赞过