MySQL时间段查询,无数据补0

上一节提到分时间段统计,可是无数据的时候不显示,而此时我们需要让他显示0。

首先我们需要建一个时间表。

CREATE TABLE `my_date` (
  `date` date NOT NULL,
  PRIMARY KEY (`date`)
)

并且插入一些数据,具体怎么插入有好多种方法,目的是生成我们需要的时间格式,如下

以下就要用到我们的时间表,与我们的数据表进行连接查询了。呃,中间的1你们可以忽略啊!!你们需要看的只有 t 和 count

mysql> select DATE_FORMAT(md.date,‘%Y-%m‘) t,1,count(*) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) group by t;

+---------+---+----------+
| t       | 1 | count(*) |
+---------+---+----------+
| 2015-01 | 1 |        1 |
| 2015-02 | 1 |        1 |
| 2015-03 | 1 |        1 |
| 2015-04 | 1 |        1 |
| 2015-05 | 1 |        1 |
| 2015-06 | 1 |        1 |
| 2015-07 | 1 |        1 |
| 2015-08 | 1 |        1 |
| 2015-09 | 1 |        1 |
| 2015-10 | 1 |        1 |
| 2015-11 | 1 |        1 |
| 2015-12 | 1 |        1 |
| 2016-01 | 1 |        1 |
| 2016-02 | 1 |        1 |
| 2016-03 | 1 |        1 |
| 2016-04 | 1 |        1 |
| 2016-05 | 1 |        1 |
| 2016-06 | 1 |        1 |
| 2016-07 | 1 |        1 |
| 2016-08 | 1 |       22 |
| 2016-09 | 1 |       26 |
| 2016-10 | 1 |        3 |
| 2016-11 | 1 |        1 |
| 2016-12 | 1 |        1 |
+---------+---+----------+
24 rows in set

这里出现了一个问题,无数据的字段变成1了,哈哈哈,什么鬼呀,神经病啊。注意,这里的count(*) 代表统计所有的行,你数据表的那一行无数据,可是我们进行left join 获得的一行不止数据表吧?还有时间表的,时间表那里不为空,是有数据的,所以变成了1。所以我们要把count(*) 变成 count(a.article_id)

mysql> select DATE_FORMAT(md.date,‘%Y-%m‘) t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) group by t;
+---------+---+---------------------+
| t       | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2015-01 | 1 |                   0 |
| 2015-02 | 1 |                   0 |
| 2015-03 | 1 |                   0 |
| 2015-04 | 1 |                   0 |
| 2015-05 | 1 |                   0 |
| 2015-06 | 1 |                   0 |
| 2015-07 | 1 |                   0 |
| 2015-08 | 1 |                   0 |
| 2015-09 | 1 |                   0 |
| 2015-10 | 1 |                   1 |
| 2015-11 | 1 |                   0 |
| 2015-12 | 1 |                   0 |
| 2016-01 | 1 |                   0 |
| 2016-02 | 1 |                   0 |
| 2016-03 | 1 |                   0 |
| 2016-04 | 1 |                   0 |
| 2016-05 | 1 |                   0 |
| 2016-06 | 1 |                   0 |
| 2016-07 | 1 |                   1 |
| 2016-08 | 1 |                  22 |
| 2016-09 | 1 |                  26 |
| 2016-10 | 1 |                   3 |
| 2016-11 | 1 |                   1 |
| 2016-12 | 1 |                   1 |
+---------+---+---------------------+
24 rows in set

到这里我们发现,时间表里面有多少时间就查出多少,如果我时间表里面有1亿个那还了得!所以我们要进行限制,比如要查当前年份的每个月数据。

mysql> select DATE_FORMAT(md.date,‘%Y-%m‘) t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) where DATE_FORMAT(md.date,‘%Y‘) = DATE_FORMAT(curdate(),‘%Y‘) group by t;
+---------+---+---------------------+
| t       | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2016-01 | 1 |                   0 |
| 2016-02 | 1 |                   0 |
| 2016-03 | 1 |                   0 |
| 2016-04 | 1 |                   0 |
| 2016-05 | 1 |                   0 |
| 2016-06 | 1 |                   0 |
| 2016-07 | 1 |                   1 |
| 2016-08 | 1 |                  22 |
| 2016-09 | 1 |                  26 |
| 2016-10 | 1 |                   3 |
| 2016-11 | 1 |                   1 |
| 2016-12 | 1 |                   1 |
+---------+---+---------------------+
12 rows in set

如果我们要指定年份呢

mysql> select DATE_FORMAT(md.date,‘%Y-%m‘) t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) where DATE_FORMAT(md.date,‘%Y‘) = ‘2015‘ group by t;
+---------+---+---------------------+
| t       | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2015-01 | 1 |                   0 |
| 2015-02 | 1 |                   0 |
| 2015-03 | 1 |                   0 |
| 2015-04 | 1 |                   0 |
| 2015-05 | 1 |                   0 |
| 2015-06 | 1 |                   0 |
| 2015-07 | 1 |                   0 |
| 2015-08 | 1 |                   0 |
| 2015-09 | 1 |                   0 |
| 2015-10 | 1 |                   1 |
| 2015-11 | 1 |                   0 |
| 2015-12 | 1 |                   0 |
+---------+---+---------------------+
12 rows in set

那个时间表里面的数据一定要事先生成咯,生成个几十年就够用了,公司说不定活不到那个时候呢哈哈哈,好好笑

下面进行一下每年的统计,到这里我时间表加入了2014年的12个月

mysql> select DATE_FORMAT(md.date,‘%Y‘) t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) group by t;
+------+---+---------------------+
| t    | 1 | count(a.article_id) |
+------+---+---------------------+
| 2014 | 1 |                   0 |
| 2015 | 1 |                   1 |
| 2016 | 1 |                  54 |
+------+---+---------------------+
3 rows in set

这个呢,时间表里面有多少年就显示多少年,我们也可以指定、

mysql> select DATE_FORMAT(md.date,‘%Y‘) t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) where DATE_FORMAT(md.date,‘%Y‘) > ‘2014‘ group by t;
+------+---+---------------------+
| t    | 1 | count(a.article_id) |
+------+---+---------------------+
| 2015 | 1 |                   1 |
| 2016 | 1 |                  54 |
+------+---+---------------------+
2 rows in set
mysql> select DATE_FORMAT(md.date,‘%Y‘) t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,‘%Y-%m‘) = DATE_FORMAT(a.article_time,‘%Y-%m‘) where DATE_FORMAT(md.date,‘%Y‘) > ‘2014‘ and DATE_FORMAT(md.date,‘%Y‘) < ‘2016‘ group by t;
+------+---+---------------------+
| t    | 1 | count(a.article_id) |
+------+---+---------------------+
| 2015 | 1 |                   1 |
+------+---+---------------------+
1 row in set
时间: 2024-10-14 13:17:28

MySQL时间段查询,无数据补0的相关文章

报表统计——java实现查询某年某月每天数据,没数据补0

一般图表绘制例如echarts等,返回数据格式都大同小异.重点是利用sql或者java实现数据格式的转型,接下来是关键部分: 1.前提1:提供的工具方法——获取某月有多少天 //通过年份和月份确定该月的最后一天 public static int getMaxDay(int year,int month ){ Calendar time=Calendar.getInstance(); time.clear(); time.set(Calendar.YEAR,year); //year 为 int

Oracle 用中文作为关键字查询无数据及sql loader 导入数据时数据分隔异常的解决办法

前提:电脑A使用sqlldr向电脑B中的Oracle批量导入数据.数据分隔及查询都正常. 拷贝A中的源数据及ctl文件到电脑C中,拷贝B中的Oracle安装文件并安装至电脑C中. 电脑C使用ctl将源文件导入本机Oracle中之后发现.导入的数据分隔错误,比如[email protected]@ccc格式的数据,sqlldr导入的时候用@分隔.但是实际导入结果并不是column1=aaa,column2=bbb, column3=ccc:有部分数据变成了[email protected],[em

如何在MySQL中查询当前数据上一条和下一条的记录

如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from table_a      where id =          (select id from              table_a where id < {$id} [and other_conditions]              order by id desc limit 1      

MySQL如何查询当月数据

自己写了一个比较简单效率又高的方法,分享给大家: WHERE addTime BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01') AND NOW() 方法就是过滤 本月1日到当前时间的数据

MySql插入查询的数据(命名Sql常用)

1.导入渠道对账索引 insert into rec_sourceidx (         trandt,transq,chnlcd,chnldt,chnlsq,chnlst,tranam,matched ) select (#trandtidx#,#transqidx#,#chnlcdidx#,#chnldtidx#,#chnlsqidx#,#chnlstidx#,#tranamidx#,'Y')  from #tablename# where #trandtidx#>=date_sub(#

【MySQL】MySQL中查询出数据表中存在重复的值

select serial_num,count(*) as count FROM card_ticket GROUP BY serial_num HAVING count >1 参考 https://www.cnblogs.com/xuzhengzong/p/9877248.html 原文地址:https://www.cnblogs.com/jing-yan/p/12598853.html

mysql模糊查询表里的json格式的数据-177

mysql里查询 json 数据 1.mysql里有个字段存储的是json格式的数据, 2.现在需要从页面传递参数到php再进行搜索匹配关键字, 3.将关键字页json_encode后,去like匹配这个字段,匹配不到 解决方案: 1.只针对中文搜索,存的数据一样是json,josn里面的中文一般是unicode编码的,将关键字编码一下. 2.在mysql里,"\" 是需要转义的.两种解决办法: a)因此使用"\\"来查询,数据依然是空.(mysql斜杆转义之后,会

从MySQL到Redis 提升数据迁移的效率

场景是从MySQL中将数据导入到Redis的Hash结构中.当然,最直接的做法就是遍历MySQL数据,一条一条写入到Redis中.这样可能没什么错,但是速度会非常慢.而如果能够使MySQL的查询输出数据直接能够与Redis命令行的输入数据协议相吻合,可能就省事多了.根据测试800w的数据迁移,时间从90分钟缩短到2分钟.具体案例如下:MySQL数据表结构: CREATE TABLE events_all_time (id int(11) unsigned NOT NULL AUTO_INCREM

mysql查询特定时间段内的数据

SET FOREIGN_KEY_CHECKS=0; -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user ( userId bigint(20) NOT NULL, fullName varchar(64) NOT NULL, userType varchar(16) NOT NULL, addedTime datetime NO