首页 > 解决方案 > 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地址的输入/输出总字节数。

标签: mysqlmariadb

解决方案


基本上,您需要为当前日期计算每月的第 13 天。您可以使用本月的第 13 天

CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY

如果当前日期小于 13,则只需减去一个月:

CURDATE() - INTERVAL DAY(CURDATE()) - 13 DAY - INTERVAL IF(DAY(CURDATE()) < 13, 1, 0) MONTH

计算后,您可以从该日期起SUM的所有downloadupload值:

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 ROLLUPGROUP 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

dbfiddle 上的演示


推荐阅读