Oracle - 查找不在表中的所有日期

时间:2013-01-10 16:56:10

标签: sql oracle date

我们有一个带有DATE列的表。我们如何编写一个脚本,该脚本将在接下来的n年中返回任何周末日期(周六或周日),我们在表格中没有给定的周末日期?

2 个答案:

答案 0 :(得分:6)

要在今天和今天之间的所有周末+ 365天:

select as_of_date
from
(
  select
    rownum,
    sysdate + rownum - 1 as as_of_date
  from dual
  connect by rownum <= (sysdate+365) - sysdate
) sub
where to_char(as_of_date, 'DY', 'nls_date_language=AMERICAN') in ('SAT', 'SUN')

要排除给定表格中的日期,只需添加&#34;并且不存在(从your_table y中选择1,其中y.the_date = as_of_date)&#34;或类似的,像那样:

select as_of_date
from
(
  select
    rownum,
    sysdate + rownum - 1 as as_of_date
  from dual
  connect by rownum <= (sysdate+365) - sysdate
) sub
where to_char(as_of_date, 'DY', 'nls_date_language=AMERICAN') in ('SAT', 'SUN')
      and not exists (select 1 from my_table myt where myt.as_of_date = sub.as_of_date)

可以简化为不使用子查询,只需更改&#34; as_of_date&#34;的出现次数。列到&#34; sysdate + rownum - 1&#34;而且你应该很好

值得注意的是,当我需要获取所有日期时,我使用了该查询,而不仅仅是周末。我在答案中所做的只是排除最外层查询中的周末。如果您不想返回不需要的数据,我确定最内层的查询可以更改为不经过365天,但只能通过周末数量(即使用rownum&lt; 365/5)并在星期六或星期日开始检索日期+(6,7),但我不认为这是一个很大的性能问题,所以我并不担心这个

答案 1 :(得分:1)

这些类型的问题出现了很多。它们通常涉及创建某种序列并将其映射回来。

相反,如果你可以找到一个缺失的日期跟随一行中缺少日期的数量,那么类似下面的内容将起作用:

select t.date+7, (nextdowdate - t.date)/7 as nummissing
from (select t.date, lead(t.date) over (partition by to_char(t.date, 'Dy') order by date) as nextdowdate
      from t
      where to_char(t.date, 'Dy') in ('Sat', 'Sun')
     ) t
where nextdowdate - t.date > 7 and
      date between FirstDate and LastDate

这假设存在第一个日期并且数据超出了最后一个日期。基本上,它是在日期之间找到差距,然后向前移动一周并计算间隙的长度。