SQL Server:如果本周的开头是星期一,为什么上周日包括在那个星期?

时间:2017-04-03 22:49:30

标签: sql-server

我正在处理一个输出网格以用于制图的存储过程。用户可以输入间隔以天,周,月等显示图表。驱动此网格的数据在名为moddate的列中有一堆时间戳。为了分组,我正在使用:

DATEADD(<interval>, datediff(<interval>, 0, moddate), 0)

天,月,季度和年都一切正常。然而,周数包括上周日。例如,以下select语句给出了2017-04-03的答案:

select "start_of_week" = dateadd(week, datediff(week, 0, '2017-04-02 00:00:00.000'), 0);

start_of_week: 
'2017-04-03 00:00:00.000'

Changning @@ datefirst不会影响结果。

我想我的问题有两个:

  1. 为什么4月2日被认为是从4月3日开始的一周的一部分?
  2. 有没有更好的方法来解决这个问题,而不是首先检查一个星期的间隔,然后检查每个日期以查看它是否是一个星期日,如果是,最后把-7而不是0?
  3. 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我最终在select和group中使用了CASE:

SELECT CASE
  WHEN @interval = 'week'
  THEN DATEADD(<interval>, DATEDIFF(day, 0, moddate)/7, 0)
  ELSE DATEADD(<interval>, DATEDIFF(<interval>, 0, moddate), 0)
  END as moddate,
   fullname,
   isnull(totals, 0) as totals
FROM #results
GROUP BY CASE
  WHEN @interval = 'week'
  THEN DATEADD(<interval>, DATEDIFF(day, 0, moddate)/7, 0)
  ELSE DATEADD(<interval>, DATEDIFF(<interval>, 0, moddate), 0)
  END, fullname

关键的一点是在小组中再次使用案例。

我感谢{7}}获得/ 7位,因为减去7会使每个答案减少一周。