Mysql 将给定日期范围内的每日总计转化为每周总计
Posted
技术标签:
【中文标题】Mysql 将给定日期范围内的每日总计转化为每周总计【英文标题】:Mysql Sum daily totals into weekly totals for given date range 【发布时间】:2017-01-25 14:53:41 【问题描述】:目前我的 db 表每天都有 dailTotal 值,我需要将这些分组到每周总计中。
是否可以将每日总计添加到每周总计中,并在给定日期范围内每周显示一行。
我不太确定从哪里开始。我目前要获取的查询是:
SELECT dailyTotal
FROM energyUsage
WHERE meterIdentifier = '1300011505120'
AND startTime >= '2017-01-01 00:00:00'
AND startTime <= '2017-12-31 00:00:00';
【问题讨论】:
【参考方案1】:星期可能有点模棱两可。一个方便的定义是内置定义。所以,你可以用yearweek()
做你想做的事:
SELECT YEAREWEEK(startTime) as yyyyww, SUM(dailyTotal)
FROM energyUsage
WHERE meterIdentifier = '1300011505120' AND
startTime >= '2017-01-01' AND
startTime <= '2017-12-31'
GROUP BY yyyyww
ORDER BY yyyyww;
您可以查看mode
参数来控制星期是从星期日还是星期一开始,以及一年中的第一周是什么时候。没有模式说:“一年中的第一周从 1 月 1 日开始”,尽管您可以为此输入逻辑。
注意:如果startTime
有时间组件,我猜你想要:
WHERE meterIdentifier = '1300011505120' AND
startTime >= '2017-01-01' AND
startTime < '2018-01-01' -- note the inequality
【讨论】:
如果没有规定从 1 月 1 日开始的年份,您的查询中使用的是什么?因为这就是我想要的 @user794846 。 . .阅读mode
参数。 . . dev.mysql.com/doc/refman/5.7/en/….【参考方案2】:
您可以使用聚合函数:
SELECT dailyTotal,
sum(dailyTotal) over (partition by EXTRACT(MONTH FROM StartTime)) as MonTotal
FROM energyUsage
WHERE meterIdentifier = '1300011505120'
AND startTime >= '2017-01-01 00:00:00'
AND startTime <= '2017-12-31 00:00:00';
我在这里假设了很多事情,但你明白了。
1- MySQL版本支持聚合函数
2- 您的字段是日期类型
【讨论】:
您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 2 行的 '(partition by EXTRACT(MONTH FROM StartTime)) as MonTotal FROM energyUsage WHER' 附近使用 什么版本的mysql允许over-partition? $ mysql --version mysql Ver 15.1 Distrib 5.5.50-MariaDB, for Linux (x86_64) using readline 5.1 但是你可以在 MySQL 中重现它。看***.com/questions/11806528/…【参考方案3】:应该这样做:
SELECT SUM(dailyTotal) AS weeklyTotal
FROM energyUsage
WHERE meterIdentifier = '1300011505120'
AND startTime >= '2017-01-01 00:00:00'
AND startTime <= '2017-12-31 00:00:00'
GROUP BY YEAR(startTime),WEEK(startTime);
【讨论】:
这个似乎不起作用:“字段列表”中的未知列“weeklyTotal”以上是关于Mysql 将给定日期范围内的每日总计转化为每周总计的主要内容,如果未能解决你的问题,请参考以下文章
MS ACCESS – 返回一个日期范围内的每日预订资源计数