1

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

4

3 回答 3

2

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

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

例如:

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

然后与您的表左连接,或使用 where not exists 子查询(这可能会更快)在您生成的不包含匹配记录的日期中获取日期。

于 2013-06-08T11:54:48.400 回答
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)
于 2013-06-08T11:56:07.840 回答
0

给定一个日期列,您需要生成开始日期和结束日期之间所有可能日期的列表,然后删除那些已经存在的日期。正如Mark 已经建议的那样,生成所有日期列表的明显方法是使用分层查询。不过,您也可以在不提前知道日期的情况下执行此操作。

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
        ;

这是一个 SQL Fiddle

CTE 第二层的要点是有一个“表”,其中包含您需要的所有信息,但只有一行,这样分层查询才能正常工作。

于 2013-06-08T12:38:49.777 回答