使用datepart计算第1个jan的错误美国周数

时间:2017-11-03 07:16:14

标签: sql sql-server sql-server-2016 week-number datepart

SQL server DATEPART函数有两个选项来检索周数; ISO_WEEKWEEK。我知道两者之间的区别,我希望根据美国的星期日开始标准得到周数;即WEEK。但它并没有像我预期的那样处理部分周。 e.g。

SELECT DATEPART(WEEK,'2015-12-31')    --53
SELECT DATEPART(WEEK,'2016-01-01')    --1
SELECT DATEPART(WEEK,'2016-01-03')    --2

给出一周的两个不同的周数,分为两年。我希望在工作日内实现类似以下链接的内容。

Week numbers according to US standard

基本上我想要这样的东西;

SELECT DATEPART(WEEK,'2015-12-31')    --1
SELECT DATEPART(WEEK,'2016-01-01')    --1
SELECT DATEPART(WEEK,'2016-01-03')    --2

修改 基本上我不善于将一周划分为两周,我必须根据周数进行一些计算,并且不能接受单周的划分。所以如果以上是不可能的。

第一周是否可能从2016-01-03开始。即在这种情况下我会是这样的:

SELECT DATEPART(WEEK,'2015-12-31')    --53
SELECT DATEPART(WEEK,'2016-01-01')    --53
SELECT DATEPART(WEEK,'2016-01-03')    --1

2 个答案:

答案 0 :(得分:2)

如果您想要美国编号,可以通过获取周末的WEEK编号而不是日期本身来实现。

首先确保系统中一周中第一天的设置实际上是星期日。您可以通过运行SELECT @@DATEFIRST来验证这一点;周日应该返回7。如果没有,请先运行SET DATEFIRST 7;

SELECT 
    end_of_week=DATEADD(DAY, 7-(DATEPART(WEEKDAY, '20151231')), '20151231'),
    week_day=DATEPART(WEEK, DATEADD(DAY, 7-(DATEPART(WEEKDAY, '20151231')), '20151231'));

将返回2016/01/02 - 1。

答案 1 :(得分:0)

如果您希望生成一个日期的周数,它将返回一年中的周数(输入日期)

因此,我认为sql server会对待2015-12-31'作为2015年的最后一周。