作为示例日期,我在两年内的表格中有一些日期
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-2012
和08-jan-2012
相同的标准。我的问题是甲骨文有什么方法可以找到缺少的日期。请帮助!
这将使您失去一年的所有日子(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
;
确保使用绑定变量而不是对日期进行三次硬编码。
您可以生成所需的日期范围序列,然后使用 LEFT JOIN 查找错过的日期。
与@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;