获取星期和年份的第一个和最后一个日期

时间:2020-03-26 08:24:50

标签: sql sql-server tsql date

我正在尝试从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月1日在星期五之前开始时才开始一年的第一周(nexw年中必须有4天为第一周)

2 个答案:

答案 0 :(得分:1)

您可以在下面的逻辑中尝试使用此方法从周和年中查找一周的开始和结束日期。这会将星期一视为一周的开始。

(来自在线搜索的逻辑)

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

答案 1 :(得分:0)

我建议使用参考星期一(过去),这是您查找本周星期一的基础。举一个例子:

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