2012-12-21 73 views
3

日期我在表中的一些日期超过二十年如这是一个例子日期寻找失踪使用SQL

01-jan-2012 
02-jan-2012 
04-jan-2012 
05-jan-2012 
06-jan-2012 
07-jan-2012 
09-jan-2012 
11-jan-2012 
. 
. 
. 
01-DEC-2012 

我想你已经注意到的03-jan-201208-jan-2012丢失日期和同一标准与所有日期。我的问题是,有没有什么方法在甲骨文找到失踪的日期。Plz帮助!

+0

我不这么认为,Oracle会帮你找到缺失的日期。因为这些都是数据,所以你可以做,写一些查询,这将帮助你找到那些缺失的日期 – Ravi

+0

可以让我看一些例子 – user1915635

回答

8

这会让你忘掉一年的所有日子(SQL Fiddle)。

all_dates生成2012年所有日期的列表(根据需要进行调整),LEFT JOIN检查IS NULL会消除源表中存在的那些日期。

WITH all_dates AS (
    SELECT TO_DATE('01-jan-2012') + ROWNUM - 1 AS d 
    FROM dual 
    CONNECT BY ROWNUM <= ADD_MONTHS(TO_DATE('01-jan-2012'), 12) - TO_DATE('01-jan-2012') 
) 
SELECT all_dates.d 
FROM all_dates 
LEFT JOIN t ON (t.d = all_dates.d) 
WHERE t.d IS NULL 
ORDER BY all_dates.d 
; 

确保使用绑定变量而不是对日期进行三次硬编码。

+0

是否有可能设置结束日期而不是天数?例如从“01.01.2012”到“2014年12月31日”选择日期时,2012年将有366天,但2013年和2014年仅有265天,因为2012年是闰年。 – LPrc

+1

@LPrc:我编辑了我每年工作的答案,无论闰年与否。事实上,这样做更有意义,希望它有帮助。 –

1

您可以生成所需的日期范围序列,然后使用LEFT JOIN找到错过的日期。

0

与@Peter差不多相同的答案,但版本略有不同。

select all_dates.date_ missing_dates from 

(select to_date('01-Jan-14') + level - 1 date_ 
from dual connect by level <= 365) all_dates 

left join 

((select to_date('01-Jan-14') + level - 1 date_ 
from dual connect by level <= 365)    

minus 

(select to_date(round (dbms_random.value (1, 28)) 
     || '-' 
     || round (dbms_random.value (01, 12)) 
     || '-' 
     || round (dbms_random.value (2014, 2014)), 
     'DD-MM-YYYY') + level - 1 random_date_1 
from dual 
connect by level <= 52)) transaction_data 

on all_dates.date_ = transaction_data.date_ 
where transaction_data.date_ is null;