简体   繁体   English

从周和年获取第一个和最后一个日期

[英]Get first and last date from week and year

I am trying to retrieve the first and last date from a week and year in T-SQL.我试图从 T-SQL 中的一周和一年中检索第一个和最后一个日期。 I found some exemples in stackoverflow or in google but nothing work well.我在 stackoverflow 或 google 中找到了一些示例,但没有任何效果。 The better exemple I find is this one :我发现更好的例子是这个:

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

But I need the week start on a monday.但我需要一周从星期一开始。 And if I change it, it works for 2019 and not 2020. I am really stuck on this point.如果我改变它,它适用于 2019 年而不是 2020 年。我真的坚持这一点。

Edit : First day of the week need to be monday.编辑:一周的第一天需要是星期一。 And week number are iso formated.并且周数是iso格式的。 First week of the year start only if 1 january is before a Friday (4 days in nexw year needed to be first week)仅当 1 月 1 日在星期五之前时才开始一年的第一周(下一年的 4 天必须是第一周)

You can try this below logic to find start and end date of a week from week and year number.您可以尝试以下逻辑,从周数和年数中查找一周的开始和结束日期。 This will consider Monday as a week starter.这将把星期一视为一周的开始。

(Logic taken from online search) (逻辑取自网上搜索)

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

I would suggest using a reference monday (in the past), which is your base in order to find the monday in your week.我建议使用参考星期一(过去),这是您在一周中找到星期一的基础。 Following an example:下面是一个例子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM