oracle 中日期自動補全,沒有數據自動補0

oracle中日期自動補全,沒有數據自動補0

1、業務需求

因查詢系統內瀏覽器的使用記錄,需要查詢某一時間段內使用的數量,數據庫中存在默些天沒有數據,也沒有日期,所以按照常規的查詢方法沒法查詢出所有的日期以及對應的數據。
1.1、正常查詢如下*:(如果想直接看結果,請看第二段:實現思路

SELECT COUNT(*) AS COUNT, TO_CHAR(OPERATETIME, 'yyyy-MM-dd') DATAS
FROM   T_S_LOG
WHERE  TO_CHAR(OPERATETIME, 'yyyy-MM-dd') >= '2019-01-01' AND
       TO_CHAR(OPERATETIME, 'yyyy-MM-dd') <= '2019-01-17' AND LOGLEVEL = 1 AND
       USERID ='b5e7f84c5ec9d46eed3c6cac55fce03a'
GROUP  BY TO_CHAR(OPERATETIME, 'yyyy-MM-dd')
ORDER  BY DATAS

1.2、查詢出來的數據如下:2019-01-01、2019-01-05的數據不存在,無法滿足需求。
在這裏插入圖片描述

2、實現思路

先通過DUAL表查詢出時間段內的所有日期DATAS,然後通過左連接、右連接上表數據COUNT,獲取A標的所有日期和B表的所有數據(無數據以0補充);主要設計的有NVL(查詢字段,無數據補充字段)、TO_DATE(’’,’’)函數、TO_CHAR(’’,’’)函數、CONNECT BY、TRUNC(‘大日期’,‘小日期’)日期減法函數、LEFT JOIN … ON… .
2.1、自動補全日期SQL

SELECT TO_CHAR(TO_DATE('2019-01-01', 'yyyy-MM-dd') + ROWNUM - 1,  'yyyy-MM-dd') AS DATAS
FROM   DUAL
CONNECT BY ROWNUM <= TRUNC(TO_DATE('2019-01-17', 'yyyy-MM-dd') - TO_DATE('2019-01-01', 'yyyy-MM-dd')) + 1

3、實現SQL

3.1、補全之後查詢sql

SELECT NVL(B.COUNT, 0), A.DATAS
FROM   (SELECT TO_CHAR(TO_DATE('2019-01-01', 'yyyy-MM-dd') + ROWNUM - 1,  'yyyy-MM-dd') AS DATAS
         FROM   DUAL
         CONNECT BY ROWNUM <= TRUNC(TO_DATE('2019-01-17', 'yyyy-MM-dd') - TO_DATE('2019-01-01', 'yyyy-MM-dd')) + 1) A
LEFT   JOIN (SELECT COUNT(*) AS COUNT, TO_CHAR(OPERATETIME, 'yyyy-MM-dd') DATAS
             FROM   T_S_LOG
             WHERE  TO_CHAR(OPERATETIME, 'yyyy-MM-dd') >= '2019-01-01' AND
                    TO_CHAR(OPERATETIME, 'yyyy-MM-dd') <= '2019-01-17' AND
                    LOGLEVEL = 1 AND
                    USERID IN
                    (SELECT USERID
                     FROM   DAB_DYINFO
                     WHERE  DAB_SZDZB IN
                            (SELECT D3.ID
                             FROM   DAA_ORGINFO D3
                             WHERE  D3.DAA_ZTNO = 1
                             START  WITH D3.ID = '1-05'
                             CONNECT BY PRIOR D3.ID = DAA_ID_SJ))
             GROUP  BY TO_CHAR(OPERATETIME, 'yyyy-MM-dd')) B
ON     A.DATAS = B.DATAS
ORDER  BY DATAS;

3.2、完美perfect
在這裏插入圖片描述

4、感想

實現方式有多種:有時需要從不同的方向考慮問題,謝謝大家,有問題請留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章