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

Oracle 获取数据库中不存在的数据,oracle,oracle11g,Oracle,Oracle11g,首先。。。如果我的问题看起来很傻,我想道歉 我们是否可以得到数据库中不存在的数据。。。更具体地说,我的要求是获得整个月的日期,但我的数据库只有一个月内几天的日期 现在我需要的是获得一个月内的所有日期,尽管数据库中没有这些数据 数据库中有以下记录: 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/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
我不知道从哪里开始


感谢您的时间

您可以使用分层连接+双表来生成所需的数据:

/*
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;

从dual CONNECT BY LEVEL中选择LEVEL-1 lvl您可以使用分层连接方式+dual表生成所需的数据:

/*
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;

从dual CONNECT BY LEVEL中选择LEVEL-1 lvl您可以使用分层连接方式+dual表生成所需的数据:

/*
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;

从dual CONNECT BY LEVEL中选择LEVEL-1 lvl您可以使用分层连接方式+dual表生成所需的数据:

/*
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;

从dual CONNECT BY LEVEL中选择LEVEL-1 lvl您可以创建一列与表格内容无关的日期,如下所示:

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

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

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

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

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

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

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


Oracle中的日期实际上是十进制数字,单位是:一天。事实是,他从不这样展示。但是,一旦您知道了这一点,就可以很容易地创建加上或减去一些数字的游标。示例:您想知道过去30天的所有记录,即使不是所有的天都有相应的数据?从其中truncdate_column=trunc sysdate-30开始,然后执行相同的操作:trunc sysdate-29,然后是-28,依此类推。您可以显示实际日期,即使是在特鲁西,因为只有时间被截断为午夜,所以日期保持不变。

Oracle中的日期实际上是十进制数字,单位为:一天。事实是,他从不这样展示。但是,一旦您知道了这一点,就可以很容易地创建加上或减去一些数字的游标。示例:您想知道过去30天的所有记录,即使不是所有的天都有相应的数据?从其中truncdate_column=trunc sysdate-30开始,然后执行相同的操作:trunc sysdate-29,然后是-28,依此类推。您可以显示实际日期,即使是在特鲁西,因为只有时间被截断为午夜,所以日期保持不变。

Oracle中的日期实际上是十进制数字,单位为:一天。事实是,他从不这样展示。但是,一旦您知道了这一点,就可以很容易地创建加上或减去一些数字的游标。示例:您想知道过去30天的所有记录,即使不是所有的天都有相应的数据?从其中truncdate_column=trunc sysdate-30开始,然后执行相同的操作:trunc sysdate-29,然后是-28,依此类推。您可以显示实际日期,即使是在特鲁西,因为只有时间被截断为午夜,所以日期保持不变。

Oracle中的日期实际上是十进制数字,单位为:一天。事实是,他从不这样展示。但是,一旦您知道了这一点,就可以很容易地创建加上或减去一些数字的游标。示例:您想知道过去30天的所有记录,即使不是所有的天都有相应的数据?从其中truncdate_column=trunc sysdate-30开始,然后执行相同的操作:trunc sysdate-29,然后是-28,依此类推。您可以显示实际日期,即使是特鲁塞,因为只有时间被截断为午夜,所以当天仍然不变。

谢谢您的回复。。。你的回答是有效的,但你能解释一下逻辑吗?@Siva我在回答中添加了一些额外的信息谢谢你的回答。。。你的回答是有效的,但你能解释一下逻辑吗?@Siva我在回答中添加了一些额外的信息谢谢你的回答。。。你的回答是有效的,但你能解释一下逻辑吗?@Siva我在回答中添加了一些额外的信息谢谢你的回答。。。你的回答是有效的,但你能解释一下逻辑吗?@Siva我在回答中添加了一些额外的信息谢谢你的回答。。。。您的解决方案也在运行,您能解释一下逻辑吗?这可能解释了逻辑选择a,b,c从选择rownum-1 a,sysdate b,sysdate+rownum-1 c从双连接选择rownum<31。这只是一个数字列表。日期加整数在oracle中添加天。感谢您的回复。。。。您的解决方案也在运行,您能解释一下逻辑吗?这可能解释了逻辑选择a,b,c从选择rownum-1 a,sysdate b,sysdate+rownum-1 c从双连接选择rownum<31。这只是一个数字列表。日期加整数在oracle中添加天。感谢您的回复。。。。你的解决方案也起作用了,你能给我解释一下逻辑吗
ns逻辑从SELECT rownum-1 a、sysdate b、sysdate+rownum-1 c中选择a、b、c,从dual CONNECT中选择rownum<31。这只是一个数字列表。日期加整数在oracle中添加天。感谢您的回复。。。。您的解决方案也在运行,您能解释一下逻辑吗?这可能解释了逻辑选择a,b,c从选择rownum-1 a,sysdate b,sysdate+rownum-1 c从双连接选择rownum<31。这只是一个数字列表。日期加整数在oracle中添加天。