超过定义的周限制的总和

Sum over defined Week limits

我有一个滚动日期和相关时间。我想对我定义的星期六到星期五的 7 天工作周范围内的小时数求和。

因此我需要将任何日期定义为星期六开始的一周、星期五结束的一周以及在此范围内的总和。

table的形式为:

日期 小时
2021-06-12 星期六 3
2021-06-18 星期五 3
2021-06-21 星期一 1
2021-06-22 星期二 2

将以上 table 分组为周六至周五周总和。

星期六 星期五 Total_Hours
2021-06-12 2021-06-18 6
2021-06-19 2021-06-25 3

您可以使用日期函数为每个日期(星期六除外)获取上一个星期六,也就是它所属的一周的开始,并以此为基础进行分组:

WITH cte AS (
  SELECT *, DATEADD(day, -DATEPART(dw, Date) % 7, Date) Saturday
  FROM tablename
)
SELECT Saturday,
       DATEADD(day, 6, Saturday) Friday, 
       SUM(Hours) Total_Hours
FROM cte
GROUP BY Saturday

参见demo

此代码适用于 SQL 服务器,但类似的逻辑和功能可用于其他数据库。

您不必将其与 datepart()datename() 联系起来,后者又取决于 DATEFIRST(唉!)。

相反,您可以使用日期算法。这又取决于 0 日期是星期一这一事实。但这是不可配置的(据我所知)。

所以:

select v.week as saturday, dateadd(day, 6, v.week) as friday,
       sum(hours)
from t cross apply
     (values (dateadd(day, 7*datediff(week, 0, dateadd(day, 1, t.date)) - 2, 0))
     ) v(week)
group by v.week
order by v.week;

Here 是一个 db<>fiddle.