先解释一下什么叫ISO-8601周,或者星期四原则周,这里我先简称为iso周。
iso周简单来说就是把跨年或者跨月的周当成一个周来看,而根据其星期四所属的位置来决定这一周是属于上一个月还是下一个月。
比如下图,2017年1月1日是星期日,它属于2016年12月26日-2017年1月1日所组成的一个星期。由于这一周的星期四(2016.12.29)属于上一年的12月份,所以这周被认为是2016年的第52周而不是2017年的01周。
再看一个例子,2016年9月1日正好是个星期四,这一天属于9月,那么它所在的这一周都被认为是属于9月份的第一周,以此类推。
那么,符合这种原则的星期计算系统是经过国际标准组织认证的,标准名就是ISO-8061。
如果你看MSDN中关于datepart函数的解释,它其中一个可用的参数就是ISO_WEEK,具体用起来什么效果呢?我们看一下下图。
图中我用wk和iso_week两个参数分别查看2017年1月1日所属的周数,wk返回的是1,ISO_WEEK返回的则是52,或者更准确的说是2016年的第52周。区别就在这里!
如果你在欧美的企业里做BI系统的话,你会有很大概率遇到这种需求或者问题,需要谨记。
这里附送一些资料
1. http://www.epochconverter.com/weeks/2016 这里详细列出了2016年的ISO标准的每一周的起始和结束日期,下方有链接可以查看其它年份
2. https://en.wikipedia.org/wiki/ISO_8601 维基百科关于ISO8601标准的解释
如果您有什么看法,欢迎交流