1. 程式人生 > >oracle中日期自動補全,沒有資料自動補0

oracle中日期自動補全,沒有資料自動補0

原文地址:https://blog.csdn.net/weixin_36150793/article/details/81607574

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()函式沒有秒的精確
---------------------