我们有一个带有DATE列的表.我们怎样才能写下一个脚本,它会在接下来的n年中返回任何周末日期(周六或周日),我们在表格中没有给定的周末日期?
要在今天和今天之间的所有周末+ 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)从周六或周日开始),但我不认为这是一个很大的性能问题所以我不担心这个