查询表中不存在的日期

时间:2013-06-08 11:45:20

标签: sql database oracle

考虑一个表ABC,它有一个日期类型的列。 我们如何获得表中不存在的范围(开始日期和结束日期之间)的所有日期。 这可以在PLSQL中完成。我正在搜索SQL查询。

3 个答案:

答案 0 :(得分:2)

您需要生成要检查的任意日期列表:

http://hashfactor.wordpress.com/2009/04/08/sql-generating-series-of-numbers-in-oracle/

e.g:

-- generate 1..20
SELECT ROWNUM N FROM dual
CONNECT BY LEVEL <= 20

然后左边连接你的表,或者使用where not exists子查询(可能会更快)来获取你生成的那些不包含匹配记录的日期。

答案 1 :(得分:1)

假设你的表的日期不包含时间元素(即它们在午夜有效记录),请尝试:

select check_date
from (select :start_date + level - 1 check_date
      from dual
      connect by level <= 1 + :end_date - :start_date) d
where not exists
(select null from mytable where mydate = check_date)

答案 2 :(得分:0)

为了执行此操作,给定日期列,您需要生成开始日期和结束日期之间所有可能日期的列表,然后删除已存在的日期。作为Mark has already suggested,生成所有日期列表的明显方法是使用分层查询。您也可以在不事先知道日期的情况下执行此操作。

with the_dates as (
  select date_col 
    from my_table 
         )
 , date_range as (
  select max(date_col) as maxdate, min(date_col) as mindate 
    from the_dates 
         )
 select mindate + level
   from date_range
connect by level <= maxdate - mindate
  minus
 select date_col
   from the_dates
        ;

Here's a SQL Fiddle

CTE第二层的要点是有一个&#34;表&#34;它具有您需要的所有信息,但只有一行,以便分层查询能够正常工作。