【问题标题】:Finding week start and week end date查找周开始和周结束日期
【发布时间】:2023-03-30 12:23:02
【问题描述】:

我有周数和年份,我需要在我的 ssrs 报告的一行中显示“从 mm/dd/yy 到 mm/dd/yy 的总计。我的一周从星期一开始。例如,如果我的周数是'2' 和年份是 '2010' 然后我必须在我的 ssrs 列中显示“2010 年 1 月 4 日至 2010 年 1 月 10 日的总计。如何做到这一点?

【问题讨论】:

  • 第 1 周的日期范围是多少?我更喜欢这样的任务日历表:sqlserver2000.databases.aspfaq.com/…
  • 第 1 周 2009 年 12 月 28 日至 2010 年 1 月 3 日
  • @AliasVarghese 不正确,iso_week 1 是 2010-01-04 到 2010-01-10

标签: sql sql-server sql-server-2008 reporting-services ssrs-2008-r2


【解决方案1】:

希望对你有帮助:

declare @year char(4) = '2014'
declare @week int = 2
select dateadd(week,@week,convert(date,@year+'-01-01',121))

从此list更改适合您的日期格式

【讨论】:

    【解决方案2】:

    SQL Server 有一个DATEPART 函数,用于计算一年中的第几周。但是,您必须在此之前调用DATEFIRST 来定义一周中的哪一天代表一周的开始。就您而言,您已声明一周的开始时间是星期一(即 1)。

    SET DATEFIRST 1;
    
    SELECT SUM([your data column])
    FROM [your table]
    WHERE DATEPART(WEEKNUM, [your date column])=[your week parameter]
    AND DATEPART(YEAR, [your date column])=[your year parameter]
    

    【讨论】:

    • 我不明白你为什么投了反对票,我投了你一票。你使用datefirst(太棒了!)和datepart(太棒了!),而不是其他人写的那些蹩脚的黑客。只有他还想看看一周的开始和结束。这是缺失的,但并不多。
    • 干杯,我也不明白! :)
    【解决方案3】:

    试试这个

    declare @year char(4) = '2010'
    declare @week int = 2
    declare @fromdate datetime
    declare @todate datetime
    set @fromdate = DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + @year) + (@week-1), 7);
    set @todate = DATEADD(wk, DATEDIFF(wk, 5, '1/1/' + @year) + (@week-1), 6) ;
    ;WITH dates AS 
    (
        SELECT CONVERT(datetime,@fromDate) as Date
        UNION ALL
        SELECT DATEADD(d,1,[Date])
        FROM dates 
        WHERE DATE < @toDate
    )
    select * from dates
    

    【讨论】:

    • 再次测试你的答案,它没有返回正确的结果
    • ! a)这个分析器不正确,b)它很糟糕!声明 @year char(4)` ==> 来吧,这是最糟糕的风格!
    【解决方案4】:

    您的描述不是美国标准,也不是等周。似乎是这些的混合体。我从来没有听说过这是一个标准。快等周了。所以这就是这个答案的基础。

    计算iso年份有点棘手,你可以阅读它here

    这是您需要的语法:

    DECLARE @year int = 2010
    DECLARE @week int = 2
    ;WITH CTE AS
    (
      SELECT 
          dateadd(wk,  datediff(wk, - @week * 7, 
            cast(cast(@year as char(4)) as datetime) - 5), 0) startofweek
    )
    SELECT 
      replace('total for ' + convert(char(10), startofweek, 110)
      + ' to ' + convert(char(10), dateadd(day, 6, startofweek) , 110), '-', '/')
    FROM CTE
    

    结果:

    total for 01/11/2010 to 01/17/2010
    

    2010 年的第 2 周等值为 2010-01-11

    【讨论】:

    • 这与 ISO 周的定义不同,01/04/2010 属于 ISO 第 1 周 :-)
    【解决方案5】:

    尝试设置 DATEFIRST (https://msdn.microsoft.com/en-ie/library/ms181598.aspx)

    SET DATEFIRST 7
    
    declare @wk int  
    declare @yr int
    declare @EndOfWeek as datetime
    
    set @wk = 2
    set @yr = 2010
    
    
    SET @EndOfWeek = dateadd (week, @wk, dateadd (year, @yr-1900, 0)) + 1 - datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) )
    
    SELECT 
        replace('total for ' + convert(char(10), dateadd(day, -6, @EndOfWeek) , 110)
      + ' to ' + convert(char(10), @EndOfWeek, 110), '-', '/')
    

    结果:

    total for 01/04/2010 to 01/10/2010
    

    【讨论】: