Oracle选择数据集中未返回的日期

时间:2018-07-19 23:06:42

标签: sql database oracle

我要寻找的是开始和结束日期,我想返回不在数据集中的日期。例如,假设我要返回2018年1月,则返回所有不在列表中的日期。

对于给定的查询:

select distinct to_date(date_field, 'dd-mon-yyyy') from tbl_main where date_field >= '01-JAN-2018' and date_field <= '31-JAN-2018'

结果:

02-JAN-2018
05-JAN-2018

现在我可以查询列出一月的某天:

select to_date('01.01.2018','dd-mm-yyyy')+level-1 as dt
from dual 
connect by level <= TO_CHAR(LAST_DAY(to_date('01.01.2018','dd.mm.yyyy')),'DD')

结果:

01-JAN-18
02-JAN-18
...
31-JAN-18

因此,基于此,我尝试运行以下无效的代码:

select dt from(
select to_date('01.01.2018','dd-mm-yyyy')+level-1 as dt
from dual 
connect by level <= 
TO_CHAR(LAST_DAY(to_date('01.01.2018','dd.mm.yyyy')),'DD')) 
where dt not in (select distinct to_date(date_field, 'dd.mm.yyyy') from 
tbl_main where date_field >= '01-JAN-2018' and x_datetime_insert <= '01-JAN- 
2018') order by dt

基于个别返回的运行查询,我觉得上述查询应该可以工作。为了清楚起见,我希望结果将是一月中除以下日期以外的所有日期:

02-JAN-2018
05-JAN-2018

预期结果:

01-JAN-2018
03-JAN-2018
04-JAN-2018
06-JAN-2018
...
31-JAN-2018

任何帮助将不胜感激,并在此先感谢。

2 个答案:

答案 0 :(得分:1)

尝试一下

select to_date('01.01.2018','dd.mm.yyyy')+level-1 as dt
from dual 
connect by level <= TO_CHAR(LAST_DAY(to_date('01.01.2018','dd.mm.yyyy')),'DD')
minus
select to_date(date_field, 'dd.mm.yyyy') 
from tbl_main 
where date_field >= '01-JAN-2018'
and x_datetime_insert <= '01-JAN-2018'
order by dt

答案 1 :(得分:0)

问题是我使用的是yyyy而不是yy。一旦我改变了,我就得到了预期的结果。将来会为尝试解决类似问题的任何人留下职位。