超过定义的周限制的总和
Posted
技术标签:
【中文标题】超过定义的周限制的总和【英文标题】:Sum over defined Week limits 【发布时间】:2021-06-22 14:26:23 【问题描述】:我有一个滚动日期和相关时间。我想对我定义的周六到周五 7 天一周范围内的小时数求和。
所以我需要将任何日期定义为从周六开始的一周、周五结束的一周并在这个范围内求和。
表格形式为:
Date | Day | Hours |
---|---|---|
2021-06-12 | Saturday | 3 |
2021-06-18 | Friday | 3 |
2021-06-21 | Monday | 1 |
2021-06-22 | Tuesday | 2 |
将上表分组为周六至周五周的总和。
Saturday | Friday | Total_Hours |
---|---|---|
2021-06-12 | 2021-06-18 | 6 |
2021-06-19 | 2021-06-25 | 3 |
【问题讨论】:
哪个实际数据库... mysql、SQL-Server、Oracle等。它们有不同的日期函数 SSMS,现在添加标签 【参考方案1】:您可以使用日期函数来获取每个日期(星期六除外)的前一个星期六,这也是它所属的一周的开始,并按此分组:
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 Server,但类似的逻辑和功能可用于其他数据库。
【讨论】:
【参考方案2】:您不必将此绑定到 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 是一个 dbfiddle。
【讨论】:
以上是关于超过定义的周限制的总和的主要内容,如果未能解决你的问题,请参考以下文章
微信公众号里面的自定义菜单限制字数不超过8个汉字或16个字母