超过定义的周限制的总和
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.
我有一个滚动日期和相关时间。我想对我定义的星期六到星期五的 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.