Получить первую и последнюю дату недели и года - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь получить первую и последнюю дату недели и года в T- SQL. Я нашел несколько примеров в stackoverflow или в Google, но ничего не работает хорошо. Вот лучший пример, который я нахожу:

DECLARE @WeekNo int= 20
DECLARE @Year int=2019

SELECT DATEADD(wk,@WeekNo-1,DATEADD(yy,@Year-1900,0)) AS WeekStart,
DATEADD(wk,@WeekNo,DATEADD(yy,@Year-1900,0))-1 AS WeekEnd

Но мне нужно начало недели в понедельник. И если я изменю его, он будет работать в 2019 году, а не в 2020 году. Я действительно застрял в этом вопросе.

Редактировать: первый день недели должен быть понедельником. И номер недели iso форматируется. Первая неделя года начинается, только если 1 января раньше пятницы (4 недели в следующем году должны быть первой неделей)

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вы можете попробовать это ниже logi c, чтобы найти дату начала и окончания недели по номеру недели и года. Это будет рассматривать понедельник как недельный стартер.

(логика c взята из онлайн-поиска)

DECLARE @year INT, @isoweek INT

SET @year = 2020
SET @isoweek = 14

SELECT
DATEADD(
    d, 
    (@isoweek - 1) * 7,
    CASE (DATEPART(dw, CAST(@year AS CHAR(4)) + '-01-04') + @@DATEFIRST - 1) % 7
        WHEN 1 THEN CAST(@year AS CHAR(4)) + '-01-04'
        WHEN 2 THEN DATEADD(d, -1, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 3 THEN DATEADD(d, -2, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 4 THEN DATEADD(d, -3, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 5 THEN DATEADD(d, -4, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 6 THEN DATEADD(d, -5, CAST(@year AS CHAR(4)) + '-01-04')
        ELSE DATEADD(d, -6, CAST(@year AS CHAR(4)) + '-01-04')
    END

) AS startdate , 

DATEADD(
    d, 
    (@isoweek) * 7 - 1,
    CASE (DATEPART(dw, CAST(@year AS CHAR(4)) + '-01-04') + @@DATEFIRST - 1) % 7
        WHEN 1 THEN CAST(@year AS CHAR(4)) + '-01-04'
        WHEN 2 THEN DATEADD(d, -1, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 3 THEN DATEADD(d, -2, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 4 THEN DATEADD(d, -3, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 5 THEN DATEADD(d, -4, CAST(@year AS CHAR(4)) + '-01-04')
        WHEN 6 THEN DATEADD(d, -5, CAST(@year AS CHAR(4)) + '-01-04')
        ELSE DATEADD(d, -6, CAST(@year AS CHAR(4)) + '-01-04')
    END
) AS enddate
0 голосов
/ 26 марта 2020

Я бы предложил использовать эталонный понедельник (в прошлом), который является вашей базой, чтобы найти понедельник в вашей неделе. Следующий пример:

DECLARE @WeekNo int= 20
DECLARE @Year int=2020
DECLARE @RefMonday date = CAST('1990-01-01' AS DATE)

DECLARE @d date = DATEADD(d, 7*@WeekNo, CAST(CAST(@Year AS VARCHAR(4))+'-01-01' AS DATE))
DECLARE @offset int = DATEDIFF(d, @RefMonday, @d)%7

DECLARE @StartOfWeek date = (SELECT DATEADD(DD, -1 * @offset, @d))
DECLARE @EndOfWeek date = DATEADD(d, 6, @StartOfWeek)

SELECT @StartOfWeek AS StartOfWeek, @EndOfWeek AS EndOfWeek
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...