微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从当月开始获取mySQL中按月记录的计数

如何解决从当月开始获取mySQL中按月记录的计数

下面是我的MysqL表:

MysqL> DESCRIBE mytable;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| url_timestamp | timestamp    | NO   |     | NULL    |       |
| cr_num        | varchar(50)  | NO   |     | NULL    |       |
| status        | varchar(255) | NO   |     | NULL    |       |
| rollback_date | timestamp    | YES  |     | NULL    |       |
| rollback_user | varchar(255) | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

我希望获得cr_num的按月计数,这是过去12个月的主键。

MysqL> SELECT MONTHNAME(url_timestamp),COUNT(url_timestamp) FROM mytable WHERE status='PRODUCTION' and url_timestamp >= Now() - INTERVAL 1 YEAR GROUP BY MONTHNAME(url_timestamp);
+--------------------------+----------------------+
| MONTHNAME(url_timestamp) | COUNT(url_timestamp) |
+--------------------------+----------------------+
| November                 |                   43 |
| December                 |                   69 |
| January                  |                  220 |
| October                  |                  225 |
| February                 |                  209 |
| march                    |                  123 |
| April                    |                   93 |
| May                      |                  113 |
| June                     |                  217 |
| July                     |                  129 |
| August                   |                  185 |
| September                |                  415 |
+--------------------------+----------------------+
12 rows in set (0.01 sec)

我得到的输出有三个问题。

  1. 我希望输出从列出的当月开始即从2020年10月一直到2019年11月开始进行排序。

  2. 11月和12月是上一年的月份,即2019年;所以我想在每个月旁边显示年份。

  3. 我只想获取2020年的数据,因此,不应显示11月和12月的记录。

我不是来自数据库背景,所以我没有对我本来可以尝试的东西进行过多的研究。

解决方法

您的条件(2)和(3)不兼容。要从今年开始只获得几个月的时间:

SELECT MONTHNAME(url_timestamp),COUNT(*)
FROM mytable
WHERE status = 'PRODUCTION' AND
      YEAR(url_timestamp) = YEAR(NOW())
GROUP BY MONTHNAME(url_timestamp)
ORDER BY MIN(url_timestamp)
,

您可以使用功能LAST_DAY()来按月分组,并使用DATE_FORMAT()来用年份格式化月份:

SELECT DATE_FORMAT(LAST_DAY(url_timestamp),'%M %Y') month,COUNT(url_timestamp) counter
FROM mytable 
WHERE status='PRODUCTION' and url_timestamp >= NOW() - INTERVAL 1 YEAR 
GROUP BY month;

要正确地对行进行排序,还需要GROUP BY LAST_DAY(url_timestamp),以便可以在ORDER BY子句中使用它:

SELECT DATE_FORMAT(LAST_DAY(url_timestamp),COUNT(url_timestamp) counter
FROM mytable 
WHERE status='PRODUCTION' and url_timestamp >= NOW() - INTERVAL 1 YEAR 
GROUP BY month,LAST_DAY(url_timestamp)
ORDER BY LAST_DAY(url_timestamp);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。