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

Posted

技术标签:

【中文标题】获取周和年的第一个和最后一个日期【英文标题】:Get first and last date from week and year 【发布时间】:2020-03-26 08:24:50 【问题描述】:

我正在尝试从 T-SQL 中的一周和一年中检索第一个和最后一个日期。我在 *** 或 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 日在星期五之前才开始一年的第一周(下一年的 4 天必须是第一周)

【问题讨论】:

请查看codeproject.com/Tips/5161640/… 坦克,但此功能使用完整的日期,而不仅仅是年份和周数 202 年从星期三开始。如果您正在寻找 2020 年的第 1 周 - 您是否希望将 2019-12-30 和 2020-01-05 作为本周开始和结束的日期,或者第一周是第一个整周?年(从 1 月 6 日到 11 日)?也许您希望将 1 月 1 日和 5 日作为日期,即使该周开始于两天前 - 在您阐明这些基本规则之前无法回答这个问题。 我同意@ZoharPeled,您的要求必须非常具体。话虽如此,一周的第一天取决于您服务器的语言配置,这意味着如果使用默认 (us_english),则 SELECT @@DATEFIRST 将返回 7(星期日)。因此,如果您以 SET DATEFIRST 1 开始查询;星期一将作为第一天。 我进行了编辑以准确满足确切需求。谢谢 【参考方案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

【讨论】:

【参考方案2】:

我建议使用参考星期一(过去),这是您的基准,以便找到您一周中的星期一。举个例子:

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

【讨论】:

以上是关于获取周和年的第一个和最后一个日期的主要内容,如果未能解决你的问题,请参考以下文章

按周和年获取日期

熊猫日期时间周与预期不符

以周、月、季度和年的形式获取日期之间的差异

js 怎样获取周和日期的时间

周、月、季度和年的 Impala 日期

Yii2 PHP获得第一天的一周和最后一天的日期