Попробуйте ISO_WEEK :
select datepart(iso_week,'01-01-2020')
select datepart(iso_week,'12-29-2019')
Из документов:
ISO 8601 включает систему дат недели по ISO, систему нумерации недель. Каждая неделя связана с годом, в который происходит четверг. Например, первая неделя 2004 года (2004W01) охватила понедельник, 29 декабря 2003 года, и воскресенье, 4 января 2004 года. В европейских странах / регионах этот стиль нумерации обычно используется. Неевропейские страны / регионы обычно не используют его.
Примечание: максимальный номер недели в году может быть 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];