2014-11-24 52 views
0

首先數據...我想道歉,如果我的問題看上去很傻把那不數據庫中存在

反正我們可以得到一點不退出在數據庫中的數據...要更具體地說,我的要求是整月得到Dates,但我的數據庫只有一個月的幾天的日期。

現在我需要的是讓所有日期在一個月內,雖然數據庫並不具有數據。

數據庫有記錄:

01/01/2014 
01/02/2014 
01/05/2014 
01/24/2014 

我的要求是:

01/01/2014 
01/02/2014 
01/03/2014 
01/04/2014 
01/05/2014 
01/06/2014 
. 
. 
. 
. 
. 
01/24/2014 
. 
. 
. 

01/31/2014 

我沒有得到就從哪裏開始的想法。

感謝您的時間

回答

2

您可以使用分層CONNECT BY +雙表來生成這些數據,您需要:

/* 
WITH tab AS 
(
    SELECT to_date('01/01/2014', 'MM/DD/YYYY') dates FROM dual 
    UNION ALL SELECT to_date('01/02/2014', 'MM/DD/YYYY') dates FROM dual 
    UNION ALL SELECT to_date('01/05/2014', 'MM/DD/YYYY') dates FROM dual 
    UNION ALL SELECT to_date('01/24/2014', 'MM/DD/YYYY') dates FROM dual 
) 
*/ 
SELECT to_date('01/01/2014', 'MM/DD/YYYY') + lvl 
FROM (SELECT LEVEL - 1 lvl FROM dual CONNECT BY LEVEL <= 31) mock_tab 
    LEFT JOIN tab ON dates = to_date('01/01/2014', 'MM/DD/YYYY') + lvl 
ORDER BY 1; 

SELECT LEVEL - 1 lvl FROM dual CONNECT BY LEVEL <= 31一列lvl產生從0號到30(level是一個表示層次級別的Oracle僞列)。這是生成數字序列的常用方法。

to_date('01/01/2014', 'MM/DD/YYYY') + lvl給你從'01/01/2014' 到'01/31/2014'

邏輯日期:

1)生成所需日期在mock_tab

2 )左加入mock_tab與日期字段列上的目標表

+0

感謝您的答覆...你的答案是工作,但你能解釋一下我的邏輯。 – Siva 2014-11-24 06:40:36

+0

@Siva我已經添加了一些額外的信息在我的答案 – Multisync 2014-11-24 06:46:12

1

您可以創建如下列表內容的獨立日期列:

SELECT dateval 
FROM 
    (SELECT (trunc(sysdate, 'MM') + rownum) -1 dateval FROM dual 
    CONNECT BY rownum < 31) 
+0

感謝您的答覆....您的解決方案也在努力可以請你解釋一下我的邏輯 – Siva 2014-11-24 06:44:45

+0

這也許解釋了邏輯'選擇A,b,C FROM(選擇ROWNUM -1,SYSDATE b,SYSDATE + rownum-1 c FROM dual CONNECT BY rownum <31)'。它只是一個數字列表。日期加整數在oracle中添加了一個日子。 – evilive 2014-11-24 06:54:26

0

日期在甲骨文實際上是十進制數,並統一是:一天。事情是,他從不以這種方式展示他們。但是,一旦你知道了這一點,就很容易創建一些其中添加或減去一些數字的遊標。例如:您想知道最近30天的所有記錄,即使並非所有的日期都有相應的數據?開始「,其中TRUNC(date_column)= TRUNC(SYSDATE)-30,然後做同樣的:TRUNC(SYSDATE)-29,然後用-28等和可以顯示當前的日期,trunced即使(。因爲只有時間是「截」到午夜,一天保持不變)。

相關問題