【问题标题】:Grouping by Week Datepart, display the spanning dates e.g. "25/12/2015 - 31/12/2015"按周日期部分分组,显示跨越日期,例如“25/12/2015 - 31/12/2015”
【发布时间】:2016-02-02 17:34:45
【问题描述】:

当使用 Datepart 按周分组时,是否可以轻松地显示周跨度的日期。下面是我的sql示例:

SELECT 
'Week ' + cast(datepart(wk, Table.ApplicationDate) AS VARCHAR(2)) Week
,year(Table.ApplicationDate) Year 
,COUNT(Table.Value) AS [Applications]

FROM Table

GROUP BY datepart(wk, Table.ApplicationDate), year(GrantDetail.ApplicationDate)

理想情况下,我希望拥有Week 2 - 25/12/2015 - 31/12/2015

【问题讨论】:

    标签: sql datetime group-by datepart


    【解决方案1】:

    这将返回您正在寻找的日期范围。请注意,使用MinMax 仅在每天都有可靠的条目时才有效。

    select 'Week ' + cast(datepart(wk, Table.ApplicationDate) as varchar (2)) 
            + ' - ' 
            + convert(varchar(8), dateadd(wk, datepart(wk, Table.ApplicationDate) - 1, '1-1-' + cast(datepart(YEAR, Table.ApplicationDate) as varchar)), 3) 
            + ' - ' 
            + convert(varchar(8), dateadd(wk, datepart(wk, Table.ApplicationDate), '1-1-' + cast(datepart(YEAR, Table.ApplicationDate) as varchar)) - 1, 3)
    

    您选择相关年份的 1 月 1 日,然后将您计算的周数(减 1)加上该日期以获得该周的开始。然后再增加一周,减去一天,得到一周的结束。

    编辑:注意到您使用的是 DD/MM 而不是 MM/DD,因此编辑了我的代码以转换为正确的格式。

    【讨论】:

      【解决方案2】:

      如果您可以假设所有日期都包含在数据中,那么您可以使用minmax,否则您需要计算它们:

      dateadd(dd, -datepart(dw, min(ApplicationDate)) + 1) as StartOfWeek,
      dateadd(dd, -datepart(dw, min(ApplicationDate)) + 7) as EndOfWeek
      

      我假设您的 datefirst 设置对应于您想要使用的逻辑周,因为您已经依赖它。还要仔细检查datepart(wk, ...) 的文档,以确认它符合您的预期,尤其是在年初和年末的日期。 (请参阅Difficulties comprehending ISO_week and week in Microsoft SQL, what's happening exactly? 接受的答案)

      有些人喜欢避免使用旧的日期部分代码,所以这里是等效的:

      dateadd(day, -datepart(weekday, min(ApplicationDate)) + 1) as StartOfWeek,
      dateadd(day, -datepart(weekday, min(ApplicationDate)) + 7) as EndOfWeek
      

      您可能会发现最好根据自固定参考点以来的周数进行分组。 2012 年 1 月 1 日恰好是星期天,所以我将使用它。上面所有相同的逻辑仍然有效,如果您的任何数据落在该日期之前并不重要,因为表达式的值将只是一个负数:

      group by datediff(wk, '20120101', ApplicationDate)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多