使用 datepart 计算 1 月 1 日的美国周数错误

Wrong US week number calculation for 1st jan using datepart

SQL 服务器 DATEPART 函数有两个选项来检索周数; ISO_WEEKWEEK。我知道两者之间的区别,我想根据美国遵循的星期日开始标准获得周数;即 WEEK。但它并没有像我预期的那样处理部分周。例如

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

为一个星期给出两个不同的周数,分为两年。我想在工作日实施如下 link 中的内容。

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

如果您希望生成日期的周数,它将return年的周数(输入日期)

因此,我认为 sql 服务器将“2015-12-31”视为 2015 年的最后一周。

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

首先确保一周第一天的设置在您的系统上实际上是星期日。您可以通过 运行ning SELECT @@DATEFIRST 验证这一点;星期天应该 return 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'));

哪个 return 2016/01/02 - 1.