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日结束