1、今天遇到需求需要统计数据,数据库中只有日期字段(日期字段为 2018-01-01 11:11:11),现在要按照月份等等分组查询,查询了很多博客,最终实现代码。 (如果大家不想看思路,请直接跳转第三步)
如图所示,数据格式为这样,首先编写查询语句
select count(*) as count,month_time from (
select to_char(TO_DATE(t.date_time,'YYYY-MM-DD HH24:MI:SS'),'MM') as month_time from
tablename) group by month_time order by month_time asc
上面代码段tochar表示截取日期中mm字段,todate是把数据库字段中的日期转换为日期格式
查询结果如下:
2、我们不难发现,12月份没有数据,这并不是我想要的结果,如果12月份没有数据的话,上面的sql语句查询就没有12月份的数据,这时我们需要把sql语句再改造一下:
(这里说下思路,首先拿上面的一张表,和一个日期表关联,这个日期表里面的数据就是1-12月份,然后我们再取值,但是我并不想这样再去创建一张表,然而代码怎么实现呢?)
select '' || lpad(level, 2, 0) datevalue
from dual
connect by level < 13
上面这条sql语句是查询一张空表,里面的数字是01-12的数据,结果如下
3、最终结合sql语句查询结果
select t2.datevalue as timeDate,nvl(t1.count,0) as scanCount from (
select count(*) as count,month_time from (
select to_char(TO_DATE(t.date_time,'YYYY-MM-DD HH24:MI:SS'),'MM') as month_time from table tablename) group by month_time order by month_time asc) t1,
( select '' || lpad(level, 2, 0) datevalue
from dual
connect by level < 13) t2
where t1.month_time(+) = t2.datevalue
order by t2.datevalue
最终查询结果如下:
这里我就不解释里面的oralce里面某些函数的用法,如果大家有什么函数不懂的话,可以借鉴一下百度