首先......如果我的问题看起来很傻,我想道歉
无论如何,我们可以获得数据库中没有出现的数据...更具体地说,我的要求是整个月获得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
我不知道从哪里开始。
感谢您的时间
答案 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;到午夜,这一天保持不变)。