超过定义的周限制的总和

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。

【讨论】:

以上是关于超过定义的周限制的总和的主要内容,如果未能解决你的问题,请参考以下文章

nyoj 311 完全背包

nyoj 311-完全背包 (动态规划, 完全背包)

微信公众号里面的自定义菜单限制字数不超过8个汉字或16个字母

nyist oj 311 全然背包 (动态规划经典题)

asp.net mvc自定义JsonResult类来防止MaxJsonLength超过限制

在具有限制和大数据的熊猫中运行总和