考虑一个表 ABC,它有一个日期类型的列。我们如何获取表中不存在的范围内的所有日期(开始日期和结束日期之间)。这可以在 PLSQL 中完成。我正在为它搜索 SQL 查询。
问问题
769 次
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
;
CTE 第二层的要点是有一个“表”,其中包含您需要的所有信息,但只有一行,这样分层查询才能正常工作。
于 2013-06-08T12:38:49.777 回答