oracle中日期自动补全,没有数据自动补0

oracle中日期自动补全,没有数据自动补0

1. 描述

最近在项目中遇到一个问题,在进行oracle相关查询操作的时候,查询某个月的数据,这个月中某些日期没有数据,就造成了日期的缺失,我想做的就是不管有没有数据所有数据都要查询出来,没有数据的自动补0.

2. oracle相关查询代码

先当时做的数据库demo

  • 自动补全日期代码
SELECT
		TO_CHAR( ADD_MONTHS( TO_DATE( '2018-01', 'yyyy-MM' ), ROWNUM - 1 ), 'yyyy-MM' ) AS monthlist 
	FROM
		DUAL CONNECT BY ROWNUM <= months_between(
			to_date( '2018-12', 'yyyy-MM' ),
		to_date( '2018-01', 'yyyy-MM' )) + 1
  • 数据库查询代码,查询某个月的YJDJ总数
SELECT
		to_char( DATETIME, 'yyyy-mm' ) AS DATETIME,
		sum( YJDJ ) AS YJSUM 
	FROM
		JC_T_YJXX 
	WHERE
		YJDJ = 1 
		AND DATETIME BETWEEN to_date( '2018-01', 'yyyy-mm' ) 
		AND to_date( '2018-12', 'yyyy-mm' ) 
	GROUP BY
		to_char( DATETIME, 'yyyy-mm' ) 
	ORDER BY
	to_char( DATETIME, 'yyyy-mm' )
  • 进行左连接,对没有数据的月份补0
SELECT
	a.monthlist,
	nvl( b.YJSUM, 0 ) AS value 
FROM
	(
	SELECT
		TO_CHAR( ADD_MONTHS( TO_DATE( '2018-01', 'yyyy-MM' ), ROWNUM - 1 ), 'yyyy-MM' ) AS monthlist 
	FROM
		DUAL CONNECT BY ROWNUM <= months_between(
			to_date( '2018-12', 'yyyy-MM' ),
		to_date( '2018-01', 'yyyy-MM' )) + 1 
	) a
	LEFT JOIN (
	SELECT
		to_char( DATETIME, 'yyyy-mm' ) AS DATETIME,
		sum( YJDJ ) AS YJSUM 
	FROM
		JC_T_YJXX 
	WHERE
		YJDJ = 1 
		AND DATETIME BETWEEN to_date( '2018-01', 'yyyy-mm' ) 
		AND to_date( '2018-12', 'yyyy-mm' ) 
	GROUP BY
		to_char( DATETIME, 'yyyy-mm' ) 
	ORDER BY
	to_char( DATETIME, 'yyyy-mm' )) b ON a.monthlist = b.DATETIME 
ORDER BY
	a.monthlist
  • 查询结果

  • 上面是补全某一年月份,同理补全某一月所有日期代码如下:
SELECT
		TO_CHAR( TO_DATE( '2018-08-01', 'yyyy-MM-dd' ) + ROWNUM - 1, 'yyyy-MM-dd' ) AS daylist 
	FROM
		DUAL CONNECT BY ROWNUM <= trunc(
		to_date( '2018-08-31', 'yyyy-MM-dd' ) - to_date( '2018-08-01', 'yyyy-MM-dd' )) + 1
  • 关于trunc函数的用法
1.select trunc(sysdate) from dual --2013-01-06 今天的日期为2013-01-06
2.select trunc(sysdate, 'mm') from dual --2013-01-01 返回当月第一天.
3.select trunc(sysdate,'yy') from dual --2013-01-01 返回当年第一天
4.select trunc(sysdate,'dd') from dual --2013-01-06 返回当前年月日
5.select trunc(sysdate,'yyyy') from dual --2013-01-01 返回当年第一天
6.select trunc(sysdate,'d') from dual --2013-01-06 (星期天)返回当前星期的第一天
7.select trunc(sysdate, 'hh') from dual --2013-01-06 17:00:00 当前时间为17:35 
8.select trunc(sysdate, 'mi') from dual --2013-01-06 17:35:00 TRUNC()函数没有秒的精确
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值