获取数据库中不存在的数据

时间:2014-11-24 06:30:08

标签: oracle oracle11g

首先......如果我的问题看起来很傻,我想道歉

无论如何,我们可以获得数据库中没有出现的数据...更具体地说,我的要求是整个月获得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

我不知道从哪里开始。

感谢您的时间

3 个答案:

答案 0 :(得分: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为您提供2014年01月01日及以后的日期。到&#39; 01/31/2014&#39;

逻辑:

1)在mock_tab

中生成所需日期

2)左边连接mock_tab,目标表位于日期字段列

答案 1 :(得分:1)

您可以创建一个独立于表格内容的日期列,如下所示:

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

答案 2 :(得分:0)

Oracle中的日期实际上是十进制数,统一是:有一天。事情是,他从不以这种方式展示他们。但是,一旦你知道了这一点,就可以很容易地创建游标,其中添加或删除了一些数字。示例:您想知道过去30天内的所有记录,即使并非所有日期都有相应的数据?以&#34;开头,其中trunc(date_column)= trunc(sysdate)-30,然后执行相同的操作:trunc(sysdate)-29,然后使用-28,依此类推。您可以显示实际日期,即使在完成时也是如此(因为只有时间是&#34;被截断&#34;到午夜,这一天保持不变)。