使用SQL查找缺少的日期

时间:2012-12-21 11:44:14

标签: sql oracle

我在表格中有一些日期,像这样作为例子日期

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缺少日期以及所有日期的相同标准。我的问题是oracle中是否有任何方法可以找到丢失的日期.Plz帮助!

3 个答案:

答案 0 :(得分: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
;

确保使用绑定变量,而不是将日期硬编码三次。

答案 1 :(得分:1)

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

答案 2 :(得分: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;