SQL Server - 根据周数获取一周内的第一个日期?

JK.*_*JK. 4 t-sql sql-server week-number bugtracker.net

我有一个查询(用于bug tracker.net),按状态计算每周的错误数.但查询返回周数,我真正想要的是一周的第一个日期

select datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date)))
       as [week], bg_status , st_name as [status], count(*) as [count] 
  from bugs inner join statuses on bg_status = st_id 
 group by datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))),
          bg_status, st_name
 order by [week], bg_status
Run Code Online (Sandbox Code Playgroud)

得到周数的部分是

datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))) as [week]
Run Code Online (Sandbox Code Playgroud)

它返回此输出:

week        bg_status   status                                        count
----------- ----------- --------------------------------------------- ------
22          1           new                                           1
22          5           closed                                        32
Run Code Online (Sandbox Code Playgroud)

但最好是说每周的第一个日期,例如01-01-2010,然后是08-01-2010等

问题不是重复如何从SQL Server中的周数获得"周开始日期"和"周结束日期"?(回答说如何从一个星期开始,而不是从一周的数字开始)

不是从周数计算日期的重复(问题请求c#)

从提供的日期获取第一周的日期(问题请求javascript)不重复

我做了搜索,但找不到这个问题的答案SQL Server(2010如果重要)

Jon*_*ler 5

如果您以正确的方式考虑它,SO 1267126的答案可以应用于您的问题.

您在组中的每个错误报告日期都映射到同一周.因此,根据定义,每个错误日期也必须映射到一周的同一开始.因此,您可以在错误报告日期运行"从给定日期开始的一周开始"计算,以及周数计算,并按两个(适度可怕)表达式进行分组,最终得到您寻求的答案.

SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week],
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date)
       AS [weekstart], bg_status, st_name AS [status], COUNT(*) AS [count] 
  FROM bugs INNER JOIN statuses ON bg_status = st_id 
 GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))),
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date),
       bg_status, st_name
 ORDER BY [week], bg_status
Run Code Online (Sandbox Code Playgroud)

由于bg_reported_date是DATETIME(请参阅注释;它包含时间组件),因此有必要在确定周开始之前将其强制转换为DATE(但周数表达式不需要强制转换,以及'星期几'周开始表达式的一部分也不需要演员:)

SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week],
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1),
               CAST(bg_reported_date AS DATE)) AS [weekstart],
       bg_status, st_name AS [status], COUNT(*) AS [count] 
  FROM bugs INNER JOIN statuses ON bg_status = st_id 
 GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))),
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1),
               CAST(bg_reported_date AS DATE),
       bg_status, st_name
 ORDER BY [week], bg_status
Run Code Online (Sandbox Code Playgroud)

注意:未经测试的代码!