众所周知,一年大概由五十几周组成,但是不同的国家和地区出于不同的目的会采用不同的计算方法。
比如,中国人认为每周的第一天是星期一,而星期日就是最后一天。在一些穆斯林地区,他们则认为周六是每周的第一天。而在美国和欧洲一些国家则认为星期日是一周的开始,如下图所示的US日历,SU在最左侧代表第一天。
那么这样会有什么麻烦呢?举个例子,下图我在SQL Server中查询2017年1月8日和9日两天所对应的数字格式的星期数。
你可以看到1月8日虽然是周日,但返回值是1;1月9日是星期一返回值却是2。这是因为我用的数据库所在的服务器是使用美国制式的时间系统的。
如果你直接引用这里的返回值参与某些计算的时候会有问题,那怎么解决呢?
我们还以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
还有一种更简单的方法就是用set语句,但我不太推荐它,主要是因为它的改动范围比较大。比如在我这的数据库里,有些程序是需要按照美式时间来计算的,只有一些view才需要转换成标准格式,所以用上面的语句牵涉范围更小,更灵活。
SET DATEFIRST 1;