Sql server 上一年的第一周开始时,如何计算周数

Sql server 上一年的第一周开始时,如何计算周数,sql-server,Sql Server,我想更新名为Financial Weekday的表,该表包含以下列: ID Year StartDate EndDate WeekNo ID是一个自动生成的数字,weekno说明特定日期属于哪个星期。我想更新从2014年12月29日到2015年12月27日的一整年的日期 样本数据 ID Year StartDate EndDate WeekNo 1060 2015 28/12/2014 00:00 28/12/2

我想更新名为
Financial Weekday
的表,该表包含以下列:

ID  
Year
StartDate
EndDate
WeekNo
ID
是一个自动生成的数字,
weekno
说明特定日期属于哪个星期。我想更新从2014年12月29日到2015年12月27日的一整年的日期

样本数据

ID  Year        StartDate           EndDate             WeekNo
1060    2015    28/12/2014 00:00    28/12/2014 23:59    1
1061    2015    29/12/2014 00:00    29/12/2014 23:59    1
1062    2015    30/12/2014 00:00    30/12/2014 23:59    1
1063    2015    31/12/2014 00:00    31/12/2014 23:59    1
1064    2015    01/01/2015 00:00    01/01/2015 23:59    1
1065    2015    02/01/2015 00:00    02/01/2015 23:59    1
1066    2015    03/01/2015 00:00    03/01/2015 23:59    1
1067    2015    04/01/2015 00:00    04/01/2015 23:59    2
1068    2015    05/01/2015 00:00    05/01/2015 23:59    2

任何建议都会有帮助。

您似乎想要:

SELECT  ID,
        [Year],
        StartDate,
        EndDate,
        DATEDIFF(DAY,'20141229',StartDate)/7+1 WeekNo
FROM dbo.YourTable

我想你要解决的问题是,一周的前几天是在上一个日历年

在示例数据中,2015年的第一周从周四开始,因此您希望将从周一/周日开始的整周计算为第1周

由于您似乎有保存年份和相关日期的列来计算周数,因此您可以使用将
year
列与
StartDate
列的年份进行比较。如果它们不同,则输出1,否则取SQL Server提供的周数

例如:

SELECT DATEPART(WEEK, '20150101')
-- Outputs: 1

SELECT DATEPART(WEEK, '20141229')
-- Ouptuts: 53
所以你想让第二个例子告诉你:1

使用示例数据,可以运行此操作以生成所需的结果:

CREATE TABLE #financialweekday
    (
      [ID] INT ,
      [Year] INT ,
      [StartDate] DATETIME ,
      [EndDate] DATETIME 
    );

INSERT  INTO #financialweekday
        ( [ID], [Year], [StartDate], [EndDate])
VALUES  ( 1060, 2015, '20141228 00:00', '20141228 23:59'),
        ( 1061, 2015, '20141229 00:00', '20141229 23:59'),
        ( 1062, 2015, '20141230 00:00', '20141230 23:59'),
        ( 1063, 2015, '20141231 00:00', '20141231 23:59'),
        ( 1064, 2015, '20150101 00:00', '20150101 23:59'),
        ( 1065, 2015, '20150102 00:00', '20150102 23:59'),
        ( 1066, 2015, '20150103 00:00', '20150103 23:59'),
        ( 1067, 2015, '20150104 00:00', '20150104 23:59'),
        ( 1068, 2015, '20150105 00:00', '20150105 23:59');

SELECT  * ,
        CASE WHEN DATEPART(YEAR, StartDate) = [Year] - 1 THEN 1
             ELSE DATEPART(WEEK, StartDate)
        END AS WeekNo
FROM    #financialweekday

DROP TABLE #financialweekday
产生:

ID      Year    StartDate                EndDate                    WeekNo
1060    2015    2014-12-28 00:00:00.000  2014-12-28 23:59:00.000    1
1061    2015    2014-12-29 00:00:00.000  2014-12-29 23:59:00.000    1
1062    2015    2014-12-30 00:00:00.000  2014-12-30 23:59:00.000    1
1063    2015    2014-12-31 00:00:00.000  2014-12-31 23:59:00.000    1
1064    2015    2015-01-01 00:00:00.000  2015-01-01 23:59:00.000    1
1065    2015    2015-01-02 00:00:00.000  2015-01-02 23:59:00.000    1
1066    2015    2015-01-03 00:00:00.000  2015-01-03 23:59:00.000    1
1067    2015    2015-01-04 00:00:00.000  2015-01-04 23:59:00.000    2
1068    2015    2015-01-05 00:00:00.000  2015-01-05 23:59:00.000    2
注意:我已将日期格式化为正确的日期格式:
YYYYMMDD HH:MM
,因此,如果这些日期未存储为日期时间(应该是这样),则可能需要应用一些格式

然后,可以在update语句中使用相同的逻辑:

CREATE TABLE #financialweekday
    (
      [ID] INT ,
      [Year] INT ,
      [StartDate] DATETIME ,
      [EndDate] DATETIME ,
      [WeekNo] INT
    );

INSERT  INTO #financialweekday
        ( [ID], [Year], [StartDate], [EndDate], WeekNo)
VALUES  ( 1060, 2015, '20141228 00:00', '20141228 23:59', 0 ),
        ( 1061, 2015, '20141229 00:00', '20141229 23:59', 0 ),
        ( 1062, 2015, '20141230 00:00', '20141230 23:59', 0 ),
        ( 1063, 2015, '20141231 00:00', '20141231 23:59', 0 ),
        ( 1064, 2015, '20150101 00:00', '20150101 23:59', 0 ),
        ( 1065, 2015, '20150102 00:00', '20150102 23:59', 0 ),
        ( 1066, 2015, '20150103 00:00', '20150103 23:59', 0 ),
        ( 1067, 2015, '20150104 00:00', '20150104 23:59', 0 ),
        ( 1068, 2015, '20150105 00:00', '20150105 23:59', 0 );

UPDATE #financialweekday
SET WeekNo = CASE WHEN DATEPART(YEAR, StartDate) = [Year] - 1 THEN 1
             ELSE DATEPART(WEEK, StartDate)
        END

SELECT  *
FROM    #financialweekday

DROP TABLE #financialweekday

@塔巴勒曼:OP不需要一年中某个日期的周数,而是一个从1开始并每周递增的序列号。
DATEPART
有什么帮助?它仍然是DATEPART()+/-SomeValue。@塔巴勒曼:可能太简单了,但我想OP对“SomeValue”有问题。这就是为什么我只把我的“轻推答案”作为注释而不是答案发布的原因。@TimSchmelter OP想要日期的周数,但这一年从2014年12月29日开始,到2015年12月27日结束