Добавить неделю в таблице на сервере SQL - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу добавить вычисляемый столбец в таблицу, содержащую даты

select datepart(wk, '01-01-2020')
1

select datepart(wk, '12-29-2019')
53----result wanted 52

1 Ответ

2 голосов
/ 06 февраля 2020

Попробуйте 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];
...