跳到主要内容
版本:5.9.0

如何自定义周

需求背景

有时候常规周(周一到周日)不能满足我们的业务场景,需要自定义周来实现。

例如:如何实现周四到周三为一周?

实现方法

普通数据集

  1. 首先了解一下获取星期几的函数dayofweek([日期])与获取第几周的函数weekofyear([日期])。

spark当中星期是从星期日到星期六为一个周,也就是1到7(如下图所示),想得到常规星期需要dayofweek([日期])-1。

image.png

  1. 实现周四到周三为一周,那么每周的四五六日都应该推迟到下个周当中。
case when dayofweek([日期]) in (1,5,6,7) 
then WEEKOFYEAR([日期])+1 
else WEEKOFYEAR([日期]) 
end

image.png

  1. 最终结果:可以看出按照标准星期(周一至周日也就是1至0),已经实现从周四到周三为一周。

image.png

高性能数据集

  1. 使用函数 toDayOfWeek([日期]),先获取到该日期是星期几。

toDayOfWeek, 将Date或DateTime转换为包含一周中的某一天的编号的UInt8(周一是1, 周日是7)类型的数字。

  1. 使用函数获取该日期是属于第几周。

toWeek(日期[,模式]) ,返回Date或DateTime的周数。两个参数形式可以指定星期是从星期日还是星期一开始,以及返回值应在0到53还是从1到53的范围内。如果省略了mode参数,则默认 模式为0。

  1. 做判断,如果要实现周四-周三为自定义周,那么每周的周四、五、六、周日,这四天都要推迟到下周
case when [返回星期几] in(4,5,6,7) then ([正常周]+1) else [正常周] end
  1. 效果如下:

image.png

【注意事项】:初始的日期字段必须是Date或是DateTime类型的,如果不是的话 需要做先做转换,

toDate/toDateTime函数的日期和日期时间格式定义:YYYY-MM-DD 或者 YYYY-MM-DD hh:mm:ss