按周日期部分分组,显示跨越日期,例如“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 您要查找的日期范围。请注意,使用 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,因此编辑了我的代码以转换为正确的格式。
如果您可以假设所有日期都包含在数据中,那么您可以使用 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)
使用 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 您要查找的日期范围。请注意,使用 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,因此编辑了我的代码以转换为正确的格式。
如果您可以假设所有日期都包含在数据中,那么您可以使用 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)