按周Datepart分组,显示跨越日期,例如" 25/12/2015 - 2015年12月31日"

时间:2016-02-02 17:34:46

标签: sql datetime group-by datepart

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

2 个答案:

答案 0 :(得分: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,因此编辑了我的代码以转换为正确的格式。

答案 1 :(得分:0)

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