使用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
答案 0 :(得分:1)
这将返回您要查找的日期范围。请注意,仅当每个可能的日期都有可靠条目时,才使用Min
和Max
。
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)
如果您认为所有日期都包含在数据中,那么您可以使用min
和max
,否则您需要计算它们:
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)