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

Mar*_*eon 4 sql oracle date

我们有一个带有DATE列的表.我们怎样才能写下一个脚本,它会在接下来的n年中返回任何周末日期(周六或周日),我们在表格中没有给定的周末日期?

bed*_*der 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')
Run Code Online (Sandbox Code Playgroud)

要排除给定表中存在的日期,只需添加"而不存在(从your_table y中选择1,其中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)
Run Code Online (Sandbox Code Playgroud)

可以简化为不使用子查询,只需将"as_of_date"列的出现更改为"sysdate + rownum - 1",您应该很好

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

  • 是否所有NLS设置都有1和7作为周末值?我提到了http://stackoverflow.com/questions/3450965/determine-if-oracle-date-is-on-a-weekend (2认同)