当第一个日期等于星期日时,如何使用 datediff 对星期一到星期日进行分组

how to use datediff to group Monday to Sunday when first date equals Sunday

认识到这是一个常见问题,回答了很多次,我还没有找到适合我查询的解决方案。

我的SQL服务器@@DateFirst = 7(星期日),我正在尝试从星期一到星期日开始按周对发票[日期]的时间段进行分组。

查询工作正常,但星期日日期被分组到以下星期一组中。我明白这是为什么,但找不到解决方案。我无法创建函数,所以这些方法也无济于事。

SELECT

      DATEADD(WEEK, DATEDIFF(WEEK,0, [DATE]), 0) AS 'DATE GROUP'
      ,[BRANCH]
      ,[SUNDTYPE]
      ,COUNT([INV_NUM]) AS 'Number of Sundrys'
          ,SUM([COST]) AS 'Sundry Rev'

  FROM Invoice_Table
  WHERE [DATE] BETWEEN '2022-03-07 00:00:00.000' AND '2022-03-13 00:00:00.000'
  
  GROUP BY DATEADD(WEEK, DATEDIFF(WEEK,0, [DATE]), 0), SUNDTYPE, BRANCH

SQL 服务器是 2012

DATEADD 和 DATEDIFF 将所有日期分组到每周的星期一,期望周一到周日的日期全部分组在一起

你应该可以通过将有问题的日期向后移动 1 天来伪造它。这样,您正在寻找的是

Mon Tue Wed Thu Fri Sat Sun

但 WEEK 功能基于

Sun Mon Tue Wed Thu Fri Sat

例如,如果您基于本周的数据是

Date IS    What you ARE getting   What you want
Fri Apr 1    Week X               Week X
Sat Apr 2    Week X               Week X
Sun Apr 3    Week Y               Week X 
Mon Apr 4    Week Y               Week Y
Tue Apr 5    Week Y               Week Y

只需从正在根据周函数 () 检查的相关日期中减去 1 天,因此将所有日期回滚 1 使星期一看起来像星期日,这是您正确的断点,而星期日回滚到前一个一周的星期六。

DATEADD(WEEK, DATEDIFF(WEEK,0, dateadd( day, -1, [Date])), 0) AS 'DATE GROUP'

然后您可以 re-add 将 re-calibrate 前 1 天的日期回溯到星期一以供显示。