不同语言的周计算的坑

最近遇到一个问题,周汇报里面的周和某个业务方的不一样,我的比他多一周,我俩讨论了好久,没有结论。后来在需要通过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 ,这样就圆满啦!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容