4

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

4

2 回答 2

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')

要排除给定表中存在的日期,只需添加“and not exists (select 1 from your_table y where y.the_date = as_of_date)”或类似内容,如下所示:

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)

可以简化为不使用子查询,只需将“as_of_date”列的出现次数更改为“sysdate + rownum - 1”就可以了

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

于 2013-01-10T17:13:59.050 回答
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

This does assume that the first date is present and that the data extends beyond the last date. Basically, it is finding gaps between dates, then moving forward one week and counting the length of the gap.

于 2013-01-10T17:16:49.347 回答