背景
项目中有一个报表是留存率,包括日留存,周留存,月留存。其中在计算周留存率时,可能会直接想到【weekofyear】这个函数,然后简单拼接年就可以得到周数,大部分时候是对的,但在跨年的时候可能会出现bug。
hive> select concat(year('2019-08-01'),'-',weekofyear('2019-08-01'));
OK
2019-31
Time taken: 3.217 seconds, Fetched: 1 row(s)
上面的结果一看也没啥问题,但如果选极端一点的日期,比如【2018-12-31】:
hive> select concat(year('2018-12-31'),'-',weekofyear('2018-12-31'));
OK
2018-1
Time taken: 0.09 seconds, Fetched: 1 row(s)
得到的结果明显是错误的,【2018-12-31】明显是2018年最后一天,却算出来的周数是【2018-1】(也就是2018年第一周),
上面例子可以引出一个问题,可能会出现一周跨年的情况,比如例子中的【2018-12-31】所在的周横跨了2018和2019年,那这周是属于2018还是2019年的呢?
当然,从上面结论来看,hive的【weekofyear】函数是把【20