最近遇到一个问题,周汇报里面的周和某个业务方的不一样,我的比他多一周,我俩讨论了好久,没有结论。后来在需要通过clickhouse取数,然后找对应周的函数时才搞清楚,原来一年中的某一天属于第几周很有讲究。
截图奉上:
clickhouse里面的计算某个日期属于当年的第几周,用toWeek(date[,mode]),而以下不同的mode,代表了不同的计算标准。
以我司为例,我司周汇报数据以周日为一周的第一天,而1.1所在的周为一年的第一周。因此,这里就应该用toWeek(toDate('2021-10-10'),8),也就是这种算法处理2021-10-10为2021年的第42周。
而我的业务方和我battle的点是,他比我总是少一周,原来他直接百度的,今天是今年的第几周,而大概率是
采用了【这种“with 4 or more days this year,”的mode值,根据ISO 8601:1988对周进行编号:
如果包含1月1日的一周在后一年度中有4天或更多天,则为第1周。
否则,它是上一年的最后一周,下周是第1周。】
为此我特地翻了日历,2021-01-01是周五,而2021-01-02是周六,也就是不满足“with 4 or more days this year,”,因此这两天被算到上年的最后一周了,也就是如果以周天为一周的第一天,2021-01-03开始才算2021的第一周,以周一为一周的第一天,2021-01-04才算2021年的第一周开始。破案了!
对应的excel里面也会有,周计算函数以及不同的模式,大家使用的时候注意多方统一;
而hive sql的语法比较单一,只有weekofyear(date)这一种,经验证,这其实属于周一为一周的第一天且2021-01-04才算2021年的第一周开始,也就是clickhouse里面的mode=3,那么为了和我司的汇报保持一直,就需要处理转换一下weekofyear(date_add('2021-10-10',1))+1 ,这样就圆满啦!