【发布时间】:2020-02-06 09:34:01
【问题描述】:
我希望将计算列添加到包含日期的表中
select datepart(wk, '01-01-2020')
1
select datepart(wk, '12-29-2019')
53----result wanted 52
【问题讨论】:
标签: sql-server tsql sql-server-2016
我希望将计算列添加到包含日期的表中
select datepart(wk, '01-01-2020')
1
select datepart(wk, '12-29-2019')
53----result wanted 52
【问题讨论】:
标签: sql-server tsql sql-server-2016
试试ISO_WEEK:
select datepart(iso_week,'01-01-2020')
select datepart(iso_week,'12-29-2019')
来自文档:
ISO 8601 包括 ISO 星期日期系统,这是一个编号系统 周。每周与星期四发生的年份相关联。 例如,2004 年第 1 周 (2004W01) 涵盖 2003 年 12 月 29 日星期一 至 2004 年 1 月 4 日星期日。欧洲国家/地区通常使用 这种编号方式。非欧洲国家/地区通常这样做 不要使用它。
注意:一年中最高的周数可能是 52 或 53。
你也可以和SET DATEFIRST一起玩:
SET DATEFIRST 1
SELECT @@DATEFIRST
select datepart(week,'01-01-2020') -- 1
select datepart(week,'12-29-2019') -- 52
select datepart(week,'12-30-2019') -- 53
如果您无法在insert/update 上填充此值并且您不确定谁将对表执行操作,您可以创建如下触发器:
CREATE TABLE [dbo].[X]
(
[ID] INT IDENTITY(1,1)
,[Date] DATETIME2
,[Week] TINYINT
);
GO
CREATE TRIGGER [T] ON [dbo].[X] AFTER INSERT, UPDATE
AS
BEGIN
SET DATEFIRST 1;
UPDATE [dbo].[X]
SET [Week] = DATEPART(WEEK,A.[Date])
FROM [dbo].[X] A
INNER JOIN inserted B
ON A.[ID] = B.[ID]
END;
GO
INSERT INTO [dbo].[X] ([Date])
VALUES ('01-01-2020')
,('12-29-2019')
,('12-30-2019');
SELECT *
FROM [dbo].[X];
【讨论】: