如何用TSQL将“起始日期为周日”的美式周换算成“以周一为起始”的标准周

浏览: 1810

众所周知,一年大概由五十几周组成,但是不同的国家和地区出于不同的目的会采用不同的计算方法。

比如,中国人认为每周的第一天是星期一,而星期日就是最后一天。在一些穆斯林地区,他们则认为周六是每周的第一天。而在美国和欧洲一些国家则认为星期日是一周的开始,如下图所示的US日历,SU在最左侧代表第一天。


US日历里Sunday在最左侧,是一周的开始

那么这样会有什么麻烦呢?举个例子,下图我在SQL Server中查询2017年1月8日和9日两天所对应的数字格式的星期数。

你可以看到1月8日虽然是周日,但返回值是1;1月9日是星期一返回值却是2。这是因为我用的数据库所在的服务器是使用美国制式的时间系统的。

如果你直接引用这里的返回值参与某些计算的时候会有问题,那怎么解决呢?

Clipboard Image.png

我们还以2017年1月9日星期一为例,解决方法呢,就是下面代码的第三行,它通过取余数的方法把2换算成了1,这个方法也可以用来计算任何一天,不会错。

select datename(weekday, '2017-01-09')
select datepart(dw, '2017-01-09') as US_weekday
select (datepart(dw, '2017-01-09') + 5) % 7 + 1 as Standard_weekday

Clipboard Image.png


还有一种更简单的方法就是用set语句,但我不太推荐它,主要是因为它的改动范围比较大。比如在我这的数据库里,有些程序是需要按照美式时间来计算的,只有一些view才需要转换成标准格式,所以用上面的语句牵涉范围更小,更灵活。

SET DATEFIRST 1;
推荐 0
本文由 Naralee 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册