按周日期部分分组,显示跨越日期,例如“25/12/2015 - 31/12/2015”

Grouping by Week Datepart, display the spanning dates e.g. "25/12/2015 - 31/12/2015"

使用 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

这将 return 您要查找的日期范围。请注意,使用 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,因此编辑了我的代码以转换为正确的格式。

如果您可以假设所有日期都包含在数据中,那么您可以使用 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)