sql-一段连续日期的数据查询

后台sql实现如下图的数据支撑(图横坐标数据要求为今天的前一天往前一个月的,纵坐标为对应天的数据)

select sum(total) total, to_char(dateL,'MM"月"DD"日"') dateL from (
select sum(RZL) total,zlrq dateL from sa.SJJK_RZL rzl where zlrq >=
trunc(sysdate,'mm')
and zlrq < last_day(trunc(SYSDATE))+1
group by zlrq
union all
(SELECT 0 total, TRUNC(SYSDATE)-LEVEL dateL FROM DUAL CONNECT BY LEVEL<=TRUNC(SYSDATE)-ADD_MONTHS(TRUNC(SYSDATE),-1)
)
)
group by dateL
order by dateL

分析下注意:

基础sql知识

select trunc(sysdate, 'mm')   from   dual  --2018/7/1    返回当月第一天.

select trunc(sysdate) from dual  ---2018/7/2  今天的日期为-2018/7/2

LAST_DAY(DATE)  即 LAST_DAY(日期)  LAST_DAY函数返回指定日期对应月份的最后一天。

connect by level  是oracle中一组关键字,是用来实现递归查询的,譬如说实现查询 1,2,3,4 .....n 的数字可以使用connect by level

 举例

SQL语句如下:select level +1 from dual where connect by level <=10

这种方式可以实现查询1到n的数字,共有n行

ADD_MONTHS(TRUNC(SYSDATE),-1)  查询当前日期的前一个月的数据(比如今天是7月2号,这就是6月2号)

TRUNC(SYSDATE)-ADD_MONTHS(TRUNC(SYSDATE),-1)  两个日期的时间差为上述level 的 n,可以查到1到该时间差的行数

 TRUNC(SYSDATE)-LEVEL,当前日期减去(查询1到n的数字,共有n行)得到往前的一段连续的日期。

to_char(dateL,'MM"月"DD"日"') 把查询出来的日期处理成想要的日期的格式。

 UNION ALL 命令会列出上下所有的值

进入主题sql的Union all前半段是当月第一天到最后一天的数据

后半段是 今天的昨天往前数30天,这个时间段的数据

查询出来为什么数据只是  今天的昨天往前数30天,这个时间段的数据呢?

因为查询出来,union all上半段没数据,而下半段给了默认值0

猜你喜欢

转载自www.cnblogs.com/yizhizhangBlog/p/9254530.html