mysql - MySQL选择自上一次出现一个月的某一天以来的所有行
问题描述
所以这个想法很简单,但我不知道怎么做,我也没有在网上找到任何有用的信息。
我有一个系统设置来使用 MariaDB 跟踪互联网数据使用情况。我有一个在每个月的 13 号重置的数据上限。我希望能够显示当前周期的所有数据使用情况。
这对 MySQL 可行吗?(我将使用 grafana 来显示数据)
编辑:对不起,我不认为包括表架构
create table network.data_usage
(
time timestamp default current_timestamp() not null on update current_timestamp(),
mac varchar(32) not null,
download bigint default 0 not null,
upload bigint default 0 not null
);
显然时间字段与这个问题最相关。上传和下载字段存储自上一个条目以来特定mac地址的输入/输出总字节数。
解决方案
基本上,您需要为当前日期计算每月的第 13 天。您可以使用本月的第 13 天
CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY
如果当前日期小于 13,则只需减去一个月:
CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY - INTERVAL IF(DAY(CURDATE()) < 13, 1, 0) MONTH
计算后,您可以从该日期起SUM
的所有download
和upload
值:
SELECT SUM(download) AS downloads,
SUM(upload) AS uploads,
SUM(download + upload) AS total
FROM data_usage
WHERE time >= CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY - INTERVAL IF(DAY(CURDATE()) < 13, 1, 0) MONTH
您还可以mac
使用GROUP BY
子句为每个值求和,例如
SELECT mac,
SUM(download) AS downloads,
SUM(upload) AS uploads,
SUM(download + upload) AS total
FROM data_usage
WHERE time >= CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY - INTERVAL IF(DAY(CURDATE()) < 13, 1, 0) MONTH
GROUP BY mac
如果按 分组,还可以通过添加到子句来mac
生成总行:WITH ROLLUP
GROUP BY
SELECT COALESCE(mac, 'Total') AS mac,
SUM(download) AS downloads,
SUM(upload) AS uploads,
SUM(download + upload) AS total
FROM data_usage
WHERE time >= CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY - INTERVAL IF(DAY(CURDATE()) < 13, 1, 0) MONTH
GROUP BY mac WITH ROLLUP
推荐阅读
- javascript - 在 Ionic 的 AngularFireCollection 上使用搜索过滤器
- java - 基于属性值的动态任务依赖
- java - Eclipse:Junit 我在下面的 junit 选项卡中看到了这个错误
- c - 使用 ctrl+d 结束凯撒密码
- html - 更改浏览器默认表单下拉按钮?
- ios - 另一个 xib 中的自定义 xib 大小不正确
- unity3d - 墙不显示
- javascript - TypeName 的条件类型给出错误
- python - Tensorflow 安装错误:此平台上不受支持的轮子 - Python 3.6.7 - pip 20.0.2
- google-sheets-api - 如何使用 gdscript 在 godot 中进行读写 http 请求?